【问题标题】:Will Spring JPA repository save() do an update, sometimes?Spring JPA 存储库 save() 有时会进行更新吗?
【发布时间】:2015-05-11 04:51:55
【问题描述】:

我有两个 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 的 NEW 对象 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 创建了 NEW 对象。

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 如何防止在保存 A 的地方插入/更新 B?比如说,B 可以作为只读表存在,A 应该具有 1-1 关系。我不想在保存 A 的同时对 B 进行任何 jpa 操作。这可能吗?我尝试在 A 中 B 的 @JoinColumn 上使用 insertable=false 和 updatable=false,但我无法将 A 本身保存为强制值(B 的键)在 A 中丢失。
    • 移除级联属性。
    猜你喜欢
    • 2016-06-19
    • 1970-01-01
    • 2016-07-12
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多