我需要这个Hibernate托管对象实例的路线图。
首先,我创建一个具有初始属性的实例,并将该对象保存在db中。 然后关闭与此对象关联的会话。 但是,我仍然序列化我的对象,并在下一步反序列化它,调用一些setter, 我需要更新数据库中的更改内容。
我应该使用哪种Hibernate会话方法? 第一步是persist()或save(),第二步是saveOrUpdate()吗?
实际上我看到saveOrUpdate()可用于每一步。唯一的问题是,正如我所见, 它不会返回相关的PK。当我们坚持使用对象时,你知道如何获得它吗? 第一次?我想,在我们持久化对象之后,它会得到一个id字段集,所以 在调用saveOrUpdate(myObject)之后,myObject.getId()返回PK?
你会推荐什么?
答案 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
返回修改后的实例(而不是修改作为参数传递的实例)并允许更新。