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

Will Spring JPA repository save() do an update, sometimes?

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

  1. 将 B 创建为 B b = new B() 并仅设置预持久化数据,保存对象时会自动设置一些日期信息。
  2. 将 A 创建为 A a = new A() 并设置所有必填字段并将 b 设置为 a。
  3. 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 注释,应该在保存时设置)

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

  1. 当我保存实体 a1 时,出现异常,因为 b1 缺少必需属性。我不明白它是如何工作的第一次而不是现在?
  2. 此外,hibernate 是否在保存 a1 时比较 a1 和 oldA 的键并执行 update() 而不是 insert()。?

如果这次是更新操作,那么只有我能得到一个异常,因为 'b1' 上缺少强制数据,因为强制属性之一应该在 @PrePersist 期间设置,而不是在 @PreUpdate 期间设置.

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

谢谢

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