• SpringBoot JPA not-null property references a null or transient value 问题解决


      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::               (v2.7.13)

    问题描述:

    使用JPA编辑实体时报错:

    not-null property references a null or transient value : com.psquare.book.entity.system.Role.createAt; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value : com.psquare.book.entity.system.Role.createAt

    解决方法:

    报错的字段恰好时更新时不需要的字段,在字段对应的@Column注解中设置updatable=false解决

    @Column(nullable = false, updatable = false)
    private Date createAt;
    @Column(nullable = false, length = 50, updatable = false)
    private String createBy;

    也可以先使用ID获取当前需要更新的实体,然后修改需要更新的字段后再使用save保存,这样每次更新都是全字段,如果字段比较多对数据库性能会有影响。可以在实体类上使用@DynamicUpdate注解,这样hibernate在生成更新SQL时就只包含值有变更并且不为null的字段。 但这样如果在当前事务中没有获取过当前实体,Hibernate会先查询下数据库,以便获取到实体进行字段对比。

    未使用@DynamicUpdate注解生成的更新SQL edit:test_hot3
    Hibernate: select role0_.id as id1_1_0_, role0_.create_at as create_a2_1_0_, role0_.create_by as create_b3_1_0_, role0_.update_at as update_a4_1_0_, role0_.update_by as update_b5_1_0_, role0_.description as descript6_1_0_, role0_.name as name7_1_0_ from role role0_ where role0_.id=?
    Hibernate: update role set update_at=?, update_by=?, description=?, name=? where id=?

    添加@DynamicUpdate 

    @DynamicUpdate
    public class Role
    

    使用了@DynamicUpdate注解后生成的更新SQL edit:test_hot4
    Hibernate: select role0_.id as id1_1_0_, role0_.create_at as create_a2_1_0_, role0_.create_by as create_b3_1_0_, role0_.update_at as update_a4_1_0_, role0_.update_by as update_b5_1_0_, role0_.description as descript6_1_0_, role0_.name as name7_1_0_ from role role0_ where role0_.id=?
    Hibernate: update role set update_at=?, name=? where id=?

    使用了@DynamicUpdate注解后,在service中先load再更新 生成的SQL edit:test_hot5
    Hibernate: update role set update_at=?, name=? where id=?

  • 相关阅读:
    go基础学习笔记
    深入理解JVM----垃圾回收算法
    Python 实现Word转PDF
    赶紧进来!!!教你C语言实现扫雷小游戏(文章最后有源码!!!)
    短剧小程序开发,重塑视频观看体验的科技革命
    【Python3】初识Python及其基础知识
    关于正负数的取模并小议某度的流量生产思维
    白杨SEO:如何拆解一个权6网站SEO优化方式和变现?我们做SEO可以学习哪些?
    leetcode 474. Ones and Zeroes 一和零(中等)
    MyBatis一对多关联查询
  • 原文地址:https://blog.csdn.net/tianlangstudio/article/details/133738056