2012-01-18 127 views
0

以下問題與這些技術相關:休眠:更新關聯實體

  • 休眠4或3
  • 春3.1
  • 傑克遜
  • 的Ext JS 4

假設我有兩張桌子,父母和孩子。

的父類是如下:

class Parent { 
    private int id; 
    private String name; 

    //getter and setter methods 
} 

的子類如下:

class Child { 
    private int id; 
    private String name; 

    @ManyToOne // uni-directional many-to-one association to Parent 
    @JoinColumn(name = "parent_id") 
    private Parent parent; 

    //getter and setter methods 
} 

現在,已經有數據庫的這些數據:

表:父

id name 
=================== 
1 parent one 
2 parent two 

表:孩子

id name   parent_id 
============================= 
1 child one 2 

的問題是

Parent newParent = new Parent(); 
newParent.setId(1); 

Child child = new Child(); 
child.setId(1); 
child.setParent(newParent); 

session.saveOrUpdate(child); 

:我可以用這些對象從「父母兩個」爲「母一個」 更新「孩子一個」父有關其他信息,子對象由Spring MVC + Jackson從JSON自動映射到ExtJS從瀏覽器發送的JSON。

的JSON格式如下:

{id: 1, name: "child one", parent: {id: 1, name: "parent one"}} 

所以,孩子和newParent對象上面實際上是創建和Spring MVC的+傑克遜設置隱含

所以Spring MVC控制器內的實際代碼如下:

@RequestMapping(value = "child/update", method = RequestMethod.POST) 
@ResponseBody 
public Map<String, ?> update(@RequestBody Child child) { 

    // validation for child object 

    session.saveOrUpdate(child) 

    // prepare response 
} 

同樣重要的位置,從瀏覽器發送可能是JSON中包含了新的父項的名稱

... parent: {id: 1, name: "parent one"} ... 

雖然那些「name」屬性也可能被Spring映射,它應該被Hibernate省略,因爲我只想更新「子」一條記錄,而不更新名稱(「父一條」記錄)。

我知道使用HQL可以輕鬆完成。但是因爲瀏覽器發送JSON,並且Spring可以自動將JSON映射到對象,所以使用session.saveOrUpdate()而不是HQL會更容易。

任何建議如何做到這一切?

非常感謝。

回答

2

我可以通過使用這些對象將「子女一」的父母從「父母二」更新爲「父母一」嗎?

簡答:是的。

瀏覽器發送JSON到服務器; Spring收到請求並將其映射到update(); Spring檢查Content-Type標題並確定響應正文包含application/json; Spring會檢查它的messageConverters以查看是否有任何可以處理JSON的轉換器; Spring發現Jackson並將JSON轉換爲您的Child對象;該對象被傳遞到update(),您可以在其中執行操作,例如,通過saveOrUpdate()通過休眠來保存它。

只要parent字段是關係的擁有方(它是,根據您提供的模型),「子女」與其父母之間的關係將被更新。提供給父母的名稱可能是;這取決於你的級聯規則。

內部發生的事情是,Jackson創建新的ParentChild對象,hibernate根據ID找到現有實體;父ID已經存在,所以saveOrUpdate()選擇更新。

+0

謝謝berbajay。但是,如果我更新兩次相同的記錄,我得到了這個異常:_org.hibernate.NonUniqueObjectException:具有相同標識符值的不同對象已經與session_ – 2012-01-19 17:22:19

+1

關聯在這種情況下,您需要使用[merge](http:// docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Session.html#merge(java.lang.Object))來協調您的對象與會話。 – beerbajay 2012-01-19 23:03:37