Spring JPA 存储库 save() 有时会进行更新吗?
Will Spring JPA repository save() do an update, sometimes?
我有两个 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 类型的新对象 a1 并映射 oldA 的所有数据。
此处对象 a1 与获取的 oldA 具有完全相似的数据,但唯一不同的是,a1 组成了一个新的 B() 对象,假设 b1 和 b1 具有与 'b' 相同的键,但缺少一些强制日期(由于 jpa 注释,应该在保存时设置)
我在保存新实体时有几个问题。
- 当我保存实体 a1 时,出现异常,因为 b1 缺少必需属性。我不明白它是如何工作的第一次而不是现在?
- 此外,hibernate 是否在保存 a1 时比较 a1 和 oldA 的键并执行 update() 而不是 insert()。?
如果这次是更新操作,那么只有我能得到一个异常,因为 'b1' 上缺少强制数据,因为强制属性之一应该在 @PrePersist 期间设置,而不是在 @PreUpdate 期间设置.
为什么休眠会执行更新而不是插入?我第二次为 A 和 B 创建了新对象。
谢谢
Hibernate 将检查 id 字段是否为空。如果是这样,那么它将插入数据,如果 id 字段有值,Hibernate 将更新具有该 id 的行。因此,如果您创建一个新对象并从另一个对象复制值,并且您想在数据库中创建一个新条目,请确保 id 字段保持为空。
我有两个 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 类型的新对象 a1 并映射 oldA 的所有数据。
此处对象 a1 与获取的 oldA 具有完全相似的数据,但唯一不同的是,a1 组成了一个新的 B() 对象,假设 b1 和 b1 具有与 'b' 相同的键,但缺少一些强制日期(由于 jpa 注释,应该在保存时设置)
我在保存新实体时有几个问题。
- 当我保存实体 a1 时,出现异常,因为 b1 缺少必需属性。我不明白它是如何工作的第一次而不是现在?
- 此外,hibernate 是否在保存 a1 时比较 a1 和 oldA 的键并执行 update() 而不是 insert()。?
如果这次是更新操作,那么只有我能得到一个异常,因为 'b1' 上缺少强制数据,因为强制属性之一应该在 @PrePersist 期间设置,而不是在 @PreUpdate 期间设置.
为什么休眠会执行更新而不是插入?我第二次为 A 和 B 创建了新对象。
谢谢
Hibernate 将检查 id 字段是否为空。如果是这样,那么它将插入数据,如果 id 字段有值,Hibernate 将更新具有该 id 的行。因此,如果您创建一个新对象并从另一个对象复制值,并且您想在数据库中创建一个新条目,请确保 id 字段保持为空。