2013-07-01 131 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實體的所有值。永不偏袒。性能通常幾乎沒有什麼區別。主要表現在選擇正確的行。一旦找到行,對檢索列的影響就會減小。在極端的情況下,如果你在桌上有很多幾十或幾百列 - (*咳嗽*)不好的設計(*咳嗽*) - 那麼你可以用一對一的關係(好)分成兩張桌子,或者你可以使用大量惰性加載列(差/最小化)。 –