【问题标题】:Hibernate saveOrUpdate command changes fields of existing row to NULLHibernate saveOrUpdate 命令将现有行的字段更改为 NULL
【发布时间】:2013-07-01 02:07:23
【问题描述】:

我有一个对象作为另一个对象的成员,比如说 Object1 和 Object 2。 对象 2 在对象 1 中,并且有 3 个字段。

我从用户那里收到对象 1 的详细信息。 还有来自用户的对象 2 的 ID 和名称,需要将 Object1 保存在数据库中,所以我使用 session.saveOrUpdate(object1),

但是它会保存 object1 并保留用户提供的 object 2 的字段,并将其他字段更改为 NULL。

我应该传递 Object2 的所有字段来避免这个问题,还是有办法阻止休眠将这些字段更改为 NULL 并保留它们的值?

Object1

 ID
 name
 @ManyToOne (cascade = CascadeType.ALL)
 Object2

Object2

  ID 
  name
  age

示例

我在数据库中有什么

对象 2 的 ID =13 名称=XYZ 年龄=32

用户进入

对象 1 名称 = 杰克

对象 2 ID = 13 名称=XYZ

保存object1后,object2如下

Object2 ID = 13 name=XYZ age=NULL

【问题讨论】:

  • 对于更新,您应该先从 db 读取,然后应用 ypur 更改,然后保存
  • @WandMaker 问题已更新
  • Object2 是嵌入对象还是关联(数据库中的外键)?如果是关联,在关系上设置什么级联?
  • @AmirPashazadeh 其外键在对象 1 表中,问题已更新

标签: hibernate jakarta-ee


【解决方案1】:
  1. (a) 如果 Object1 已经存在于 DB 中,则检索它:

    Object1 obj1 = session.find(...);
    

    (b) 否则,如果 Object1 是新的,则创建它:

    Object1 obj1 = new Object1();
    
  2. 通过调用 setter 方法填充 obj1 字段

  3. (a) 如果 DB 中已经存在 Object2,则加载它:

    Object2 obj2 = obj1.getObject2();  // ensures object2 loaded; 
                                       // does lazy load if required (e.g. one-to-many)
    

    (b) 否则,如果 Object2 是新的,则创建它,并将其附加到 Object1:

    Object2 obj2 = new Object2();
    obj1.setObject2(obj2);
    
  4. 通过调用 setter 方法填充 obj2 字段

  5. 如果 Object1 到 Object2 的关系有 Cascade UPDATE OR ALL:

    session.saveOrUpdate(obj1);
    

你没有在做 (3a)(或者你在做 (3a),但是用 (3b) 替换它)。

【讨论】:

  • 这是否意味着一旦用户输入对象 2 的信息,我必须检索其所有值才能解决问题?
  • 当然。您总是检索 JPA 实体的所有值。从不偏袒。它通常对性能几乎没有影响。主要的性能影响是选择正确的行。找到行后,检索列的影响较小。在极端情况下,如果一个表中有几十个或几百个列 - (cough) 糟糕的设计 (cough) - 那么你可以分成两个表,其中一个 -一对一的关系(好),或者您可以使用大量延迟加载的列(差/最小化)。
猜你喜欢
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多