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

  • 相关阅读:
    RSSHub让万物皆可RSS
    Django-(5)
    uni-app 使用vscode开发uni-app
    [附源码]计算机毕业设计基于JEE平台springboot技术的订餐系统
    谈谈数字化转型晓知识
    小程序原生开发中的onLoad和onShow
    STM32F103C8T6第一天:认识STM32 标准库与HAL库 GPIO口 推挽输出与开漏输出
    【SQL】一篇带你掌握SQL数据库的查询与修改相关操作
    测试工程师如何帮助开发域的质量变好
    机械臂速成小指南(十七):直线规划
  • 原文地址:https://blog.csdn.net/tianlangstudio/article/details/133738056