以下问题与这些技术相关:休眠:更新关联实体
- 休眠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