Spring JPA存储库save()有时会做更新吗?

时间:2015-05-11 04:51:55

标签: spring jpa spring-data-jpa one-to-one

我有两个JPA实体,比如A和B.实体A组成B并且具有与cascade=MERGEorphanRemoval=false等的OneToOne映射。持久性执行如下

  1. 将B创建为B b = new B()并仅设置预持久性数据,保存对象时会自动设置某些日期信息。
  2. 创建A as,A a = new A()并设置所有必填字段,并将b设置为a。
  3. respotory.save(a)
  4. 一切都很好。 A,B都得救了。

    接下来,使用存储库(A oldA = repo.findOne(key))获取A.将oldA转换为另一个类似的应用程序对象,比如appA(类型A2)并执行一些应用程序逻辑,然后创建一个类型为实体A的NEW对象a1并映射来自oldA的所有数据。

    这里对象a1与获取的oldA具有完全相似的数据,但唯一不同的是,a1组成一个NEW B()对象,比如b1和b1具有与'b'相同的键,但缺少一些强制日期(其中因为jpa注释而应该在保存时设置)

    在保存新实体时,我有几个问题。

    1. 当我保存实体a1时,我得到一个例外,因为b1缺少必需属性。我不是第一次得到它的工作原理而不是现在?
    2. 另外,在保存a1并执行update()而不是insert()时,hibernate是否会比较a1和oldA的键。
    3. 如果这次是更新操作,那么只有我可以获得一个例外,因为'b1'上缺少强制数据,因为在@PrePersist期间应该设置一个强制属性,而不是@PreUpdate。

      为什么hibernate会进行更新而不是插入?我第二次为A和B创建了新对象。

      由于

1 个答案:

答案 0 :(得分:2)

如果id字段为null,Hibernate将检查。如果是这样,那么它将插入数据,如果id字段有值,Hibernate将对具有该id的行进行更新。因此,如果您创建一个新对象并从另一个对象复制值,并且您想在数据库中创建一个新条目,请确保该id字段保持为空。