• 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=?

  • 相关阅读:
    2022年半导体硅片行业研究报告
    基于 vite2 + Vue3 写一个在线帮助文档工具
    3DTiles特性与内容解析
    计算机结构体系:系统CPI计算例题(1.5)
    Codeforces Round #810 (Div. 2) D. Rain (线段树差分)
    RAW socket
    激光切割机加工过程中产生毛刺的原因及解决方案
    Python冷知识:如何找出新版本增加或删除了哪些标准库?
    【html5期末大作业】基于HTML仿QQ音乐官网网站
    Linux虚拟机怎么连接串口?
  • 原文地址:https://blog.csdn.net/tianlangstudio/article/details/133738056