2009-10-09 83 views
0
customer = // get customer from the current hibernate session 
// customer has a discount with database id of 1 

一切都很好,直到這裏。但如果我打電話:Hibernate不可變值對象

discount = SpecialDiscount.create("10%"); 
customer.setDiscountTo(discount); 

session.save(customer); 
// customer has a discount with database id of 2 now 

hibernate如何更新id爲2的同一折扣行,即使我已將其設置爲另一個折扣值對象?此外,我想通過分離前一個左右來防止「具有相同標識的對象已經存在」錯誤。你有什麼建議?

// An entity 
class Customer { 
    // one-to-one mapped immutable value object 
    SpecialDiscount discount; 

    SpecialDiscount discount() { 
     return SpecialDiscount.create(this.discount); 
    } 

    void setDiscountTo(SpecialDiscount discount) { 
     this.discount = SpecialDiscount.create(discount); 
    } 
} 
+0

? – Mark 2009-10-09 16:45:57

回答

0

要使用一對一的映射來存儲不可變的值對象,您應該在休眠條件下理想地使用一個組件(即嵌入對象)。更多細節可以在here找到。

也有看@Immutable annotation

安置自己的映射,當您收到「的對象具有相同標識已經存在」的錯誤,你應該得到更多的答覆:)

0

您還沒有發佈您的映射,這使得它不可能準確地診斷問題,您的存取方法似乎很奇怪(你爲什麼要通過SpeciaalDiscount.create()包裝的一切嗎?你即使使用例如做兩次集合你已經發布)。也就是說,如果確實將客戶映射爲一對一折扣(就像您在評論中所說的那樣),Hibernate的行爲應該與其應該一樣(更新現有的「折扣」記錄)。也許你應該使用多對一的方式(同樣,很難肯定地說不知道你在做什麼)。

0

有可能是id列自動遞增通過Hibernate和通過數據庫的事情。發佈你的映射,並檢查數據庫中的列屬性。這將有助於每個人診斷問題。

另一件事。 (我只熟悉NHibernate,所以這可能不適用。)要進行行更新,通常必須調用Update()SaveOrUpdate()而不是Save()。撥打Save()是否修改了現有記錄,或者在id = 2的數據庫中創建了新記錄?