Java 更新对象的Hibernate会话方法
我需要这个Hibernate托管对象实例的路线图 首先,我创建了一个具有初始属性的实例,并将该对象持久化到数据库中。 然后关闭与此对象关联的会话。 但是,我仍然序列化了我的对象,在下一步反序列化它时,调用一些setter, 同样,我需要更新数据库中发生的更改 我应该使用什么Hibernate会话方法? 第一步是persist()还是save(),第二步是saveOrUpdate() 事实上,我发现saveOrUpdate()可以用于每个步骤。唯一的问题是,正如我所看到的, 它不会返回关联的PK。当我们将对象持久化为 第一次?我想,在我们持久化对象之后,它会得到一个id字段集,所以 调用saveOrUpdate(myObject)后,myObject.getId()返回PKJava 更新对象的Hibernate会话方法,java,hibernate,session,Java,Hibernate,Session,我需要这个Hibernate托管对象实例的路线图 首先,我创建了一个具有初始属性的实例,并将该对象持久化到数据库中。 然后关闭与此对象关联的会话。 但是,我仍然序列化了我的对象,在下一步反序列化它时,调用一些setter, 同样,我需要更新数据库中发生的更改 我应该使用什么Hibernate会话方法? 第一步是persist()还是save(),第二步是saveOrUpdate() 事实上,我发现saveOrUpdate()可以用于每个步骤。唯一的问题是,正如我所看到的, 它不会返回关联的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显然我刚才添加了相同的注释!