2012-01-18 125 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