以下問題與這些技術相關:休眠:更新關聯實體
- 休眠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會更容易。
任何建議如何做到這一切?
非常感謝。
謝謝berbajay。但是,如果我更新兩次相同的記錄,我得到了這個異常:_org.hibernate.NonUniqueObjectException:具有相同標識符值的不同對象已經與session_ – 2012-01-19 17:22:19
關聯在這種情況下,您需要使用[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