Hibernate会话方法更新对象

时间:2010-04-05 09:01:09

标签: java hibernate session

我需要这个Hibernate托管对象实例的路线图。

首先,我创建一个具有初始属性的实例,并将该对象保存在db中。 然后关闭与此对象关联的会话。 但是,我仍然序列化我的对象,并在下一步反序列化它,调用一些setter, 我需要更新数据库中的更改内容。

我应该使用哪种Hibernate会话方法? 第一步是persist()或save(),第二步是saveOrUpdate()吗?

实际上我看到saveOrUpdate()可用于每一步。唯一的问题是,正如我所见, 它不会返回相关的PK。当我们坚持使用对象时,你知道如何获得它吗? 第一次?我想,在我们持久化对象之后,它会得到一个id字段集,所以 在调用saveOrUpdate(myObject)之后,myObject.getId()返回PK?

你会推荐什么?

2 个答案:

答案 0 :(得分:4)

如果我确实理解了你的问题,你想要将一个瞬态对象重新连接到一个新的hibernate会话。然后你应该使用Session.merge(object)

  

合并

     

对象合并(对象对象)                抛出HibernateException

     

复制给定对象的状态   用它来到持久对象上   相同的标识符如果没有   目前持久化实例   与会话相关联,它会   加载。返回持久性   实例。如果给定的实例是   未保存,保存副本并将其返回   作为一个新的持久化实例。该   给定的实例不会成为   与会话相关联。这个   操作级联到关联   映射关联的实例   with cascade =“merge”。

答案 1 :(得分:2)

来自休眠documentation

  

瞬态 - 如果一个对象刚刚使用new运算符进行实例化,并且它与Hibernate会话无关,则该对象是瞬态的。它在数据库中没有持久表示,并且没有分配标识符值。如果应用程序不再持有引用,则垃圾收集器将销毁瞬态实例。使用Hibernate Session使对象持久化(让Hibernate处理需要为此转换执行的SQL语句)。

     

Detached - 一个已分离的实例是一个持久的对象,但其Session已被关闭。当然,对对象的引用仍然有效,甚至可以在此状态下修改分离的实例。可以在稍后的时间点将分离的实例重新附加到新的会话,使其(以及所有修改)再次持久化。此功能为需要用户思考的长时间运行工作单元启用编程模型。我们称它们为应用程序事务,即从用户的角度来看工作单元。

通过这些定义,您的对象最初将是暂时的。您可以使用persist将其保存到数据库,使其持久直到会话关闭。之后,我的理解是该对象将被视为已分离,这意味着您可以根据自己的意愿对其进行修改,并merge使用新会话进行修改:obj = entityManager.merge(obj)

区别在于persist修改了您提供的对象作为参数,并且意味着最初持久保存新对象,而merge返回修改后的实例(而不是修改作为参数传递的实例)并允许更新。