什么是Hibernate脏会话?

14

我想知道什么是Hibernate的脏会话?我的一个条件查询在不应该进行插入时正在进行插入,我认为这可能与脏会话有关。但是,如果不真正了解脏会话,我就无法解决问题。另外,如何创建脏会话?谢谢。

4个回答

25

Hibernate会话是一个缓存。它缓存从数据库读取的实体,还缓存您对其中包含的实体所做的更改,以及添加和删除的实体,直到会话被刷新(即将所有挂起的更改写入数据库)。

当一些更改尚未被刷新时,会话称为。因此拥有脏会话是完全正常的。会话在事务提交之前被刷新。


如果我不想让查询触发刷新,我应该将条件查询的setFlushMode设置为手动,还是您认为这只是一个权宜之计? - Code Junkie
@George如果您不想保存对对象所做的更改,请尝试在会话之外进行这些更改。 - richarbernal
我想我需要寻找一些额外的信息来了解如何将我的数据存储在会话之外。我对Hibernate还是比较新的,所以不太确定它是如何进入会话的。 - Code Junkie
在提交事务之前,会话将被刷新。仅当flushmode未设置为手动时。@JB Nizet 不是吗? - Sachin Verma
@SachinVerma 当然可以。但那不是默认设置。 - JB Nizet
@JB,OpenSessionInViewFilter确实将session.flushmode设置为手动模式,这在现今很常见。 - Sachin Verma

7
在Hibernate中,脏会话是指在会话中加载一个对象,然后对其进行修改的情况。或者,在打开会话并创建新对象时出现。
即使您没有显式调用任何插入/更新操作,Hibernate也会将会话标记为“脏”,并在关闭会话时保存更改。

4
简单来说:我们知道脏数据是尚未提交的数据。同样地,在Hibernate中,脏会话包含尚未提交的已修改数据。

2
这段话的意思是,你对内存中、受管理的、持久化对象进行了更改,但这些更改尚未刷新到数据库中。hibernate的基本思想是,内存中持久化对象的状态就是应用程序的状态。如果你修改了一个受管理的对象,hibernate会在下一个机会将其放入数据库中。你不应该对你不想变成持久化的受管理对象进行“临时”更改,因为它们会被持久化。在执行查询之前,hibernate会将所有受管理对象的内存状态刷新到数据库中,以便查询与你的应用程序状态相符。请按原样保留HTML标签。

实际上,情况比这更复杂:只有当挂起的更改可能对执行的查询产生影响时,Hibernate 才会刷新。 - JB Nizet
有没有推荐的方法可以防止查询在我告诉它插入对象之前执行插入操作?我使用了 setFetchMode 来手动设置,这个方法有效,但我感觉这可能只是一个临时解决办法,而不是根本性的解决方案。 - Code Junkie
1
FlushMode可以在SessionFactory中更改,可能是到COMMIT而不是MANUAL,如果您不希望在事务结束之前进行插入和更新。这是修复的方法,如果您正在对不想写入数据库的托管实体进行更改,而不仅仅是一个临时措施。 - Affe
@JB,出于某种原因我认为ALWAYS是默认设置,而不是AUTO。 - Affe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接