Java 更新对象的Hibernate会话方法

Java 更新对象的Hibernate会话方法,java,hibernate,session,Java,Hibernate,Session,我需要这个Hibernate托管对象实例的路线图 首先,我创建了一个具有初始属性的实例,并将该对象持久化到数据库中。 然后关闭与此对象关联的会话。 但是,我仍然序列化了我的对象,在下一步反序列化它时,调用一些setter, 同样,我需要更新数据库中发生的更改 我应该使用什么Hibernate会话方法? 第一步是persist()还是save(),第二步是saveOrUpdate() 事实上,我发现saveOrUpdate()可以用于每个步骤。唯一的问题是,正如我所看到的, 它不会返回关联的PK。

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

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

我应该使用什么Hibernate会话方法? 第一步是persist()还是save(),第二步是saveOrUpdate()

事实上,我发现saveOrUpdate()可以用于每个步骤。唯一的问题是,正如我所看到的, 它不会返回关联的PK。当我们将对象持久化为 第一次?我想,在我们持久化对象之后,它会得到一个id字段集,所以 调用saveOrUpdate(myObject)后,myObject.getId()返回PK


您有什么建议?

如果我确实理解您的问题,您希望将一个临时对象重新附加到新的hibernate会话。那你应该用

合并

对象合并(对象对象) 抛出冬眠异常

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

从休眠状态:

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

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

根据这些定义,对象最初是瞬态的。您可以使用
persist
将其保存到数据库中,使其在会话关闭前保持不变。在此之后,我的理解是,对象将被视为分离的,这意味着您可以根据自己的意愿对其进行修改,并使用新会话将其合并:
obj=entityManager.merge(obj)


不同之处在于,
persist
修改您作为参数提供的对象,最初用于持久化新对象,而
merge
返回修改的实例(而不是修改作为参数传递的实例),并允许更新。

请注意,当您说
session.merge(transientObject)时
,它不会将transientObject转换为托管对象。您需要说
managedObject=session.merge(transientObject)
。然后您可以对
managedObject
进行更多更改,这些更改将在会话关闭时保存。@John:+1显然我刚才添加了相同的注释!