我有两个JPA实体,比如A和B.实体A组成B并且具有与cascade=MERGE
,orphanRemoval=false
等的OneToOne映射。持久性执行如下
B b = new B()
并仅设置预持久性数据,保存对象时会自动设置某些日期信息。A a = new A()
并设置所有必填字段,并将b设置为a。respotory.save(a)
一切都很好。 A,B都得救了。
接下来,使用存储库(A oldA = repo.findOne(key)
)获取A.将oldA转换为另一个类似的应用程序对象,比如appA(类型A2)并执行一些应用程序逻辑,然后创建一个类型为实体A的NEW对象a1并映射来自oldA的所有数据。
这里对象a1与获取的oldA具有完全相似的数据,但唯一不同的是,a1组成一个NEW B()对象,比如b1和b1具有与'b'相同的键,但缺少一些强制日期(其中因为jpa注释而应该在保存时设置)
在保存新实体时,我有几个问题。
如果这次是更新操作,那么只有我可以获得一个例外,因为'b1'上缺少强制数据,因为在@PrePersist期间应该设置一个强制属性,而不是@PreUpdate。
为什么hibernate会进行更新而不是插入?我第二次为A和B创建了新对象。
由于
答案 0 :(得分:2)
如果id字段为null,Hibernate将检查。如果是这样,那么它将插入数据,如果id字段有值,Hibernate将对具有该id的行进行更新。因此,如果您创建一个新对象并从另一个对象复制值,并且您想在数据库中创建一个新条目,请确保该id字段保持为空。