zxy16305 / Blog

bak for hexo
3 stars 1 forks source link

spring data JPA 笔记 #13

Open zxy16305 opened 6 years ago

zxy16305 commented 6 years ago

基于 1.11.10.RELEASE (spring boot 1.5.10.RELEASE 所用的版本)


由于上次看文档没有看到复杂查询, 这次再仔细看一遍


书签

zxy16305 commented 6 years ago

实体类中建立一对多、一对一、多对多的关系

在实际的运用中,发现直接在实体类中写父id的话,会使得程序和orm过度耦合(当然带来的是速度的优势)。要使得程序的架构更加明朗,还是得使用hibernate原来那一套。

    //注意注解加到get方法上 一对一多对多也差不多的
    @OneToMany(mappedBy = "parentDept") //这里写持有者对应的属性名
    public Set<OrgMemberEntity> getChildMember() {
        return childMember;
    }

    @ManyToOne()
    @JoinColumn(name = "parent_id")
    @NotFound(action= NotFoundAction.IGNORE)
    @org.hibernate.annotations.ForeignKey(name="none") //据说不会生成外键,不过这是过时的方法
    public OrgDeptEntity getParentDept() {
        return parentDept;
    }

在换成hibernate注解的时候,有一些小问题,记录在这里。

jpa实体类json化嵌套递归的解决方案

这里实在多的一方加上注解`@JsonIgnore`解决( ~~ 具体加在哪边我也不是很懂哈哈哈哈哈 ~~ )
这可能就是门槛吧,要知道怎么解决的甚至还得看源码

jpa的懒加载问题

在开了懒加载配置` @OneToMany(mappedBy = "parentDept",fetch = FetchType.LAZY)`的情况下,会在
查询结果生成代理对象,调用这个代理对象懒加载部分的get方法会报错(~~和我想的有点不一样啊啊~~)

解决的方法一就是关闭懒加载
解决方法二(update 18-3-17): 之前报错是因为session已经提交了(hibernate中的概念),而提交的
原因是因为,没有开启事务...所以在相关方法上加上`@Transactional`就好了。当调用get方法是会自动
查询数据库中的相关信息(好象是一开始只加载id,然后根据调用的方法再加载其他/全部数据)。

jpa update的解决方案

jpa似乎没有原生的update方案(不太确定),一般简单的方式就是先find,修改后save。
但在复杂的状态下代码就太冗余了。
这里是使用@Query注解写jpql语句完成的update操作
    @Modifying
    @Query("update OrgDeptEntity d set d.deptName = :#{#dept.deptName} 
                     where d.id= :#{#dept.id}")
    public int setByDept(@Param("dept") OrgDeptEntity orgDeptEntity);
@Modifying是写入数据库的注释,传入对象则采用@Param的方式,同时在jpql语句中使用 :#{#注解value} 的方式传入(文档上写的不是很明白,这莫非是jpql的用法)

(应该还有其他解决方案的 万能的jpa啊~)

insert or update 的解决方案

读了好几天的文档,查了好几天的资料,都没有比较好的解决方案。仔细一想,就算是mybatis也要发两条sql的,那么jpa先findone,然后再save。这好像也是比较标准的解决方案了。 :joy:

主键生成策略要指明

出现了一些奇怪的错误,在主键的get方法上加上了 @GeneratedValue(strategy = GenerationType.AUTO) 后解决了问题

关系映射保存的坑

zxy16305 commented 6 years ago

JPA审计 (JPA Auditing)

当数据写入数据库时,有些数据用程序去确定有些冗余,比如浏览次数、创建时间、修改时间。有些可以通过数据库触发器解决,而比如时间,当数据库所在的环境事件不标准时,会发生一些问题。 JPA提供了审计的功能,链接。 例如审计时间的具体的做法时,在相关字段上添加@CreatedDate 、@LastModifiedDate等注解,在实体类上加@EntityListeners(AuditingEntityListener.class)注解。

对标准JPA Entity对象的检查

由于注解加在get方法上,实际检查的get后面的参数,即要求的是标准的getter/setter

zxy16305 commented 6 years ago

FAQ

截图: image

增加配置physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl (让IDE来自动补全吧2333)