【发布时间】:2015-05-11 04:51:55
【问题描述】:
我有两个 JPA 实体,比如 A 和 B。实体 A 组成 B,并具有与 cascade=MERGE、orphanRemoval=false 等的 OneToOne 映射。持久性执行如下
- 创建 B 为
B b = new B()并仅设置预持久化数据,保存对象时会自动设置一些日期信息。 - 将 A 创建为
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 组成了一个新的 B() 对象,例如 b1 和 b1 与 'b' 具有相同的键,但缺少一些强制性日期(由于 jpa 注释,应该在保存时设置)
我在保存新实体时有几个查询。
- 当我保存实体 a1 时,我得到一个异常,因为 b1 缺少强制属性。我第一次不知道它是如何工作的,现在不知道?
- 另外,hibernate 是否在保存 a1 时比较 a1 和 oldA 的键并执行 update() 而不是 insert()。
如果这次是更新操作,那么只有我可以得到一个例外,因为“b1”上缺少强制数据,因为应该在@PrePersist 期间设置强制属性之一,而不是在@PreUpdate 期间设置。
为什么休眠会更新而不是插入?我第二次为 A 和 B 创建了 NEW 对象。
谢谢
【问题讨论】:
标签: spring jpa spring-data-jpa one-to-one