2012-10-04 39 views
3

我正在創建RESTful Web服務。客戶端可以註冊Company,然後根據需要進行更新。 CompanyAddress協會。當用戶請求Company更新它發送Company對象ID和Company涉及Address對象沒有Address es id。要更新Company對象,我使用hibernate merge方法。它會正確設置新的Company數據,但會創建新的行而不是更新它。更新休眠關聯

我該如何解決這個問題?

我可售Address通過company.getAddress()得到它的ID和合並新Address但是當我這樣做,所有Company數據正在牽強,我認爲這是不好的。

public class Company implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name = "address_id") 
    private Address address; 
} 

UPDATE

我也可以寫一個自定義查詢

UPDATE address SET city='NEW YORK' FROM companies WHERE address.id = companies.address_id 

,但我想這是一個默認的動作。如果您看到沒有ID的任何關聯,請使用上述查詢。

+0

當你合併一家公司時,所有的公司數據也被提取。不要預先優化。讓它工作,如果你有一個性能問題,看看它來自哪裏,並優化這部分。通過ID獲取公司及其地址非常快。 –

回答

0

我不太清楚你爲什麼使用合併而不是直接更新請求的地址對象。

例如。 (僞)

Company c = (Company)query.findbyid(id) 
Address a = c.getAddress() 

a.setField1(field1); 
a.setField2(field2); 
a.setField3(field3); 

pm.commit(c); 

兩件事你需要檢查,如果您正在使用合併技術設置: 1.地址關聯是延遲加載,這意味着,直到你要求它爲null。難道你是從PersistenceManager分離公司對象,然後嘗試合併?

  1. 此外,我假設你的地址也是一個實體。它會產生id(主鍵)。確保你不會搞砸了。如果它重新生成一個新的ID,你會得到另一個行。