在update方法中作为参数传递的对象可以处于持久状态还是处于分离状态?

时间:2011-11-04 03:37:02

标签: hibernate

根据hibernate doc(http://docs.jboss.org/hibernate/core/3.5/javadoc/org/hibernate/Session.html#update(java.lang.Object))更新方法 void update(Object object)抛出HibernateException这里的对象,因为参数被称为处于分离状态。但是我尝试了一些例子,其中 传递的这个对象也可以是持久状态的对象。所以我做的是

person = (Person)session. get(Person.class,1);
person.setName("scott");
// At this point of time person is in persistent stage as it has adentifier attached to it and also attached to session.
session.update(person);

它成功更新。 所以根据我的理解,传递对象作为更新方法中的参数可以处于持久状态还是处于分离状态?

2 个答案:

答案 0 :(得分:0)

  

因此根据我的理解,在更新方法中将对象作为参数传递   可以处于持久状态还是处于分离状态?

是的,您可以将持久对象或分离的对象传递给update()。但update()仅对分离的对象有影响。在持久对象上调用update()是冗余什么都不做因为该对象已经是持久的,其状态将在刷新期间自动同步到数据库。因此,从您的代码中,可以将人的姓名更新为scott,这是因为刷新,而不是由于update()。您可以通过删除update()来对其进行校对,但该名称仍然可以更新为scott

update()仅对分离的对象产生影响,这可以使分离的实例持久化并由hibernate会话管理。

答案 1 :(得分:-1)

这很奇怪。我的update()文档是:

  

使用给定的标识符更新持久化实例   分离的实例。如果存在具有相同的持久实例   标识符,抛出异常。此操作级联到   关联映射的关联实例   级联= “保存更新”。

所以,我认为它不适用于分离的对象。我通常首先合并()它们或刷新()如果它已分离。

您是否通过关闭会话,打开新会话然后更新来尝试它?