java开发中springboot使用JPA注意事项及踩过的坑

1,605 阅读2分钟

这是我参与更文挑战的第 1 天,活动详情查看[juejin.cn/post/696719…]

SpringData JPA,即Spring对JPA的封装。

官网上讲:JPA旨在通过将工作量减少到实际需要的数量,来显著改善数据访问层的操作。作为开发人员,你只需要写你的repository接口,包括自定义的方法,Spring会自动提供实现。但是正是由于这些便利性,有些规则需要严格遵守。本文主要讲述本人在使用过程中遇到的一些坑及使用时需要注意的事项,希望能够对你所有帮助。

1.使用多对多(ManyToMany)注解时,出现无限循环包含对方 解决方法:需要在多的一方的对象的set方法上写上注解 @JsonBackReference,如图

20210228201110690.png

2.通过@Query注解自定义新增sql传入对象的写法

controller写法,如图

20210228201110690.png

Repository层写法,如图

20210228201908813.png

具体代码如下:

@Transactional
@Query(value = “insert into rk_sharegroup(group_name,start_time,end_time,create_time) values(:#{#record.groupName},:#{#record.startTime},:#{#record.endTime},now())”,nativeQuery = true)
int addShareGroup(@Param(“record”)ShareGroup record);

3.jpa使用数据库默认值的问题 使用jpa自带的save方法时,新增和编辑时都是全量操作实体类属性,会对null也进行增加和修改,但有时数据库可能设置了默认值,而我们想要只设置某些字段,其他字段仍使用数据库的默认值,此时需要在实体类上添加@DynamicInsert注解

注意:但是编辑时由于新增的时候添加了默认值,编辑时有些字段可能没传,此时仍然会将已经添加的默认值置为null,所以编辑不建议使用jpa自带的save方法,防止不必要的数据覆盖问题,自己通过@Query注解写自定义更新sql

4.JPA操作默认是事务级别是只读的,如果要进行删除修改添加,必须加上@Modifyying注解,但加了此注解后,该操作虽然被声明是修改操作,但是本身的事务级别并没有改变,仍然是只读。所以需要在@Modifying前面再加上@Transactional注解,覆盖默认的事务隔离级别

5.避免注解混合使用,否则会报 org.hibernate.MappingException: Could not determine type 解决方法:注解要么写在字段上,要么写在getXX上,千万千万不能混合使用,否则会报这个错误!