2011-08-07 58 views
0

我有一個非常類似的情況,以什麼在this question描述:
EngineerManager無論從Contact繼承和Engineer可以晉升(或降級,這取決於你的觀點),以Managernhibernate將實體從一種類型轉換爲另一種類型:如何處理集合?

區別在於我記錄了聯繫人提交的所有訂單。
含義 - 我的Contact類有一個IList<Order> Orders屬性,它可以由100,000個訂單組成。 (在你問之前 - 顯然這個屬性沒有加載到內存中,它只是OrderContact OrderSubmitter屬性的另一端)。

我喜歡@Jamie Ide提出的排序的'拷貝構造函數'的想法。
問題是,我可以更改Order對象的引用而不將它們加載到內存中嗎?

[編輯]
是的,我的CAN用HQL update
但是,這會產生一個不同的問題 - 我試圖創建一個實體並讓其他實體在同一個事務中引用它。意思是:

Manager manager = new Manager(engineer); 
session.Save(manager); 
session.CreateQuery("update Order set OrderSubmitter = :manager where OrderSubmitter = :engineer") 
    .SetParameter("manager",manager) 
    .SetParameter("engineer",engineer) 
    .ExecuteUpdate(); 
session.Transaction.Commit(); 

however-使用executeUpdate immidiately發生,而Manager實體只保存 '提交'。
這當然會導致外鍵異常。
我可以通過在Save(manager)調用後明確調用session.Flush()來避開它,但這似乎不是很好的做法。

有什麼想法?

回答

0

如上所述,問題在於ExecuteUpdate()會立即出現,並且在插入新管理器後不會發出。我認爲立即調用session.Flush()是正確的解決方案。您還應該刪除同一事務中的原始工程師對象。

另請參閱this question的答案。

1

真正的問題是您的建模不正確。在OO中,對象不會改變其類型。 經理/工程師應建模爲一對一關係。 您可以將作業類作爲Employee的組件屬性。 當員工從工程師晉升爲經理時,您只需更換組件即可。另外 - 您不必更新訂單表格,因爲提交者保持不變。唯一的區別是它的工作部分

+0

+1好主意!謝謝 –

相關問題