2013-07-01 58 views
0

我有一个对象作为另一个对象的成员,可以说Object1和Object 2. 对象2在对象1中,并且有3个字段。休眠saveOrUpdate命令将现有行的字段更改为NULL

我从用户那里收到对象1的详细信息。 也ID和用户对象2名,并需要保存Object1在DB所以我用 session.saveOrUpdate(object1),

节省object1并保持对象2的Fileds用户提供并将其他文件更改为NULL。

我应该通过Object2的所有文件,避免这个问题,或者有没有办法阻止将这些字段更改为NULL并保留其值的休眠?

Object1 

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

Object2 

    ID 
    name 
    age 

我在DB什么

Object2的具有ID = 13名= XYZ年龄= 32

用户输入

Object1名=杰克

Object2的ID = 13名= XYZ

保存object1后,Object2的将是如下

Object2的ID = 13名= XYZ年龄= NULL

+2

对于更新,你应该先从数据库中读取数据,然后应用ypur更改,然后保存 –

+0

@WandMaker问题已更新 – J888

+0

是Object2和嵌入对象还是它是一个关联(数据库中的外键)?如果它是一个关联,关系上设置了什么级联? –

回答

1
  1. (一)如果Object1已经存在于DB中,则检索它:

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

    (b)else,i ˚FObject1是新的,然后创建它:

    Object1 obj1 = new Object1(); 
    
  2. 填充OBJ1领域,通过调用setter方法

  3. (a)如果对象2在数据库已经存在,则加载:

    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. 填充obj2的领域,通过调用setter方法

  5. 如果Object1到Object2的关系具有级联更新或ALL:

    session.saveOrUpdate(obj1); 
    

你不这样做(3A)(或你”重做(3a),但随后用(3b)替换它)。

+0

这是否意味着一旦用户输入对象2的信息我必须检索它的所有值来解决问题? – J888

+2

当然。您总是检索JPA实体的所有值。永不偏袒。性能通常几乎没有什么区别。主要表现在选择正确的行。一旦找到行,对检索列的影响就会减小。在极端的情况下,如果你在桌上有很多几十或几百列 - (*咳嗽*)不好的设计(*咳嗽*) - 那么你可以用一对一的关系(好)分成两张桌子,或者你可以使用大量惰性加载列(差/最小化)。 –