我需要对Hibernate合并方法做一些澄清。它是如何工作的。当我有一个分离的实体,并且我希望它被重新分配时,Hibernate是否只查看同一个实体或所有Hibernate会话中的当前会话?
有没有办法在transistent实体上使用merge?
答案 0 :(得分:3)
当您可能在当前内存中同时拥有多个对象实例时,将使用Hibernate的合并,并且您希望Hibernate保存对该对象的任何实例所做的任何和所有更改。例如,当您在验证期间通过两种不同方式加载对象时,可能会发生这种情况。
可能导致混淆的问题是应用程序会话和Hibernate会话之间的区别。在应用程序会话期间可以打开和关闭多个Hibernate会话。
如果在第一个Hibernate会话中加载对象实例,然后关闭会话,则该实例将分离。如果你打开一个新的会话,然后加载相同的对象(相同的ID),Hibernate将构造一个新的实例,如果你尝试在第一个会话中获得的对象上使用saveOrUpdate,Hibernate将抛出一个NonUniqueObjectException。
因此,虽然当前的Hibernate会话仅关注自身,但其基础结构的一部分是要了解映射Hibernate实体的较大应用程序会话中存在哪些对象,因此它应该考虑保存或合并等操作。
Merge是一种告诉Hibernate的方法“我希望你假设我对这个Hibernate实体所做的任何更改应该保存,即使我将它们设置为对象的不同实例,而不是我要求你保存的对象。 “ SaveOrUpdate是一种告诉Hibernate更保守并且抛出异常的方法。
我的博客中有关于Hibernate的saveOrUpdate和merge in this article之间差异的更多细节。
答案 1 :(得分:0)
它只在当前的hibernate会话中查找,而不是所有的hibernate会话。
对于你的第二个问题,你不能按照“瞬态”的定义(我相信你的意思,而不是'tansistent')。瞬态意味着实体尚未保存。合并意味着什么都听不到。