2009-11-17 58 views
1

認爲2個實體OneToOne映射。人和汽車。一個人可以有一輛車。這可能在休眠3.2

我們有一個從數據庫加載的Person對象。 我想換個人的車。問題是我沒有加載的Car對象使用。相反,我只有車的ID。使用這個車標,是否可以將Person's Car設置爲該需要的車(我們擁有該車),而無需從DB加載/選擇任何車?而不是保存這個人,它的車到db。我不需要獲取任何有關的信息。我只需要告訴Hibernate我想讓Person's Car成爲擁有該Id的車。

這可能嗎? 對不起,如果我的英語sux。 謝謝你的建議。

回答

0

這取決於您的關聯如何映射。

假設它通過外鍵映射(從Person到Car),並且您確定「new」car實際存在,您可以使用Session.load()方法返回新Car實體的持久代理,然後將其設置爲人並保存人員。汽車不應實際裝載只要聯想不急於獲取:

Person person = ...; 
Car newCar = session.load(Car.class, newCarId); 
person.setCar(newCar); 
session.saveOrUpdate(person); 

如果你的公會是通過主鍵映射,設置新的汽車是不可能的開始。

在一個側面說明,個人對汽車在技術上是一個一對多的(人=所有者)或許多一對多(人=驅動器)之間的關係,而不是一個對一個。

+0

感謝您的回答。我同意你關於一對多的關係。但人與車的例子很容易解釋。 如果代碼運行在遠程客戶端/無法管理的情況下,情況如何?這可能沒有.load()?任何代理汽車或代理只有id,而沒有會議可用或遠程呼叫?比我們發送我們的對象到服務器和saveOrUpdate(人)=)。 – Ginnun 2009-11-17 00:44:53

+0

遠程API是另一回事。幾種可能的選擇是:(1)讓遠程客戶端調用您的API來檢索新車實例並進行設置; (2)通過你的API暴露「changeCarOnPerson(Person,NewCarId)」; (3)寫一個CarProxy類(假設你的API允許)或者允許客戶創建一個只有ID的Car實例,在Person上設置,讓你的服務加載實際的Car實例。我必須說,選項#1是迄今爲止**最乾淨的。 – ChssPly76 2009-11-17 00:54:58

+0

感謝您的答案。那些就是我的想法。 – Ginnun 2009-11-17 01:13:59