2009-10-16 64 views
1

我的模型:更新父親攔截

public class Father { 
    Set<Son> sons = new HashSet<Son>(); 
    String name = null; 
    Date lastSonModifyDate = null; 
    // ... other fields and setters/getters 
} 
public class Son { 
    Father father = null; 
    String name = null; 
    Date lastModifyDate = null; 
    // ... other fields and setters/getters 
} 

使用案例:

  1. 有在DB一個Father對象有關聯的對象Son(雙向)。
  2. 從DB父加載。
  3. 更新父親的姓名字段。
  4. 更新兒子的名稱字段。
  5. 堅持父親。

我的攔截器首先檢測到父更新(onFlushDirty)。然後爲兒子執行onFlushDirty。在這種情況下,我更新了son.lastModifyDate 以及father.lastSonModifyDate

執行結束時,除father.lastSonModifyDate之外的所有更新都會持續。我認爲這是因爲父親在會話中並且已經在兒子之前更新過,所以這個實體覆蓋了在子實體的onFlushDirty方法中所做的更改。

我怎麼能達到我的標記(從兒子攔截器設置父親的lastSonModifyDate)?

謝謝。

回答

0

你不行。 onFlushDirty()在之後被調用,用於所有者之後的收集元素更新操作(如果有)已被調度。

是否有任何理由不能在DAO中完成上述所有操作,而不是依賴攔截器?或者在數據庫級別(將lastModifyDate屬性映射爲生成的)?

+0

我不能這樣做,DAO中,因爲兒子的對象,通常被保存/從父對象通過級聯更新中...所以我無法控制它。 也許數據庫級別是一個不錯的解決方案。但是,「生成」意味着數據庫引擎會創建時間戳?真的,我需要以具體的格式設置日期屬性,不受任何數據庫引擎支持... – Alberthoven 2009-10-16 18:15:51

+0

不確定您的意思是「通過級聯更新...所以我無法控制它」。如果你在DAO中有一個'updateFather()'方法,那麼如何防止你在調用session.update()之前打上任何你想要的實體?就數據庫而言,「具體格式」是什麼意思?日期是一個日期(時間/時間戳,無論),它保存爲這樣。如何在應用中對其進行格式化是一個完全不同的故事。 – ChssPly76 2009-10-16 18:21:12

+0

Ok,fisrt,我幾乎從來沒有爲Son對象調用過DAO.saveOrUpdate,但只能爲父對象調用...所以與父對象關聯的Son元素會在級聯中持久化(使用org.hibernate.annotations.Cascade)。其次,恐怕我對日期字段並沒有完全的真誠:實際上,Father.lastSonModifyDate和Son.lastModifyDate表示日期,但它們的類型是String,因爲使用String DateFormatter讀取和寫入它們的值。 .. 這是因爲格式是我的「不支持」的原因。 – Alberthoven 2009-10-16 18:30:25

0

您需要爲具有級聯選項的實體覆蓋onCollectionUpdate。這是在它被安排之前調用的。

歡呼〜