使用JPA注意事项及踩过的坑

  1. 使用多对多(ManyToMany)注解时,出现无限循环包含对方
    解决方法:需要在多的一方的对象的set方法上写上注解
    @JsonBackReference,如图使用JPA注意事项及踩过的坑_第1张图片
    2.通过@Query注解自定义新增sql传入对象的写法
    controller写法,如图使用JPA注意事项及踩过的坑_第2张图片
    Repository层写法,如图
    使用JPA注意事项及踩过的坑_第3张图片
    具体代码:
    @Modifying
    @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上,千万千万不能混合使用,否则会报这个错误!

你可能感兴趣的:(技术分享,java,jpa,spring,boot)