2012-05-29 82 views
10

我想知道是否有人可以告诉我什么是休眠脏会话?我似乎遇到了一个问题,即当标准查询不应该执行插入操作时。我相信这是与一个肮脏的会议有关,但不知道真正的肮脏的会议是什么,我无法解决我的问题。另外,你如何创建一个肮脏的会议。谢谢。什么是Hibernate脏会话?

回答

19

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

一个会话被称为当一些变化还没有被刷新。因此有一个肮脏的会议是完全正常的。会话在事务提交之前刷新。

+0

如果我不希望查询触发刷新,我应该设置标准查询setFlushMode为手动,还是你concided此乐队援助固定? –

+0

@George如果您不想保存对对象所做的更改,请尝试在会话外执行这些更改 – richarbernal

+0

我想我必须查找有关如何在会话之外存储数据的其他信息。我对hibernate仍然很陌生,所以不能完全确定它是如何进入会话的。 –

2

它只是意味着你已经对尚未刷新到数据库的内存中,管理的持久对象进行了更改。

基本上,休眠背后的想法是,在内存中的持久对象的状态是应用程序的状态。如果您对托管对象进行更改,则hibernate将在下一次机会中将其放入数据库中。你不应该对你不打算持久化的托管对象进行'临时'更改,因为它们将会!

在执行查询之前,hibernate将所有托管对象的内存状态刷新到数据库,以便查询相对于应用程序的状态是准确的。

+0

实际上,它比这更复杂:只有当挂起的更改可能会影响执行的查询时,才会刷新Hibernate。 –

+0

是否有推荐的方法来阻止查询在我告诉它插入对象之前执行插入操作?我用setFetchMode手动工作,但我觉得这可能只是一个乐队援助修复,而不是根修复。 –

+1

如果您不希望在事务结束前执行插入和更新操作,则可以在SessionFactory中将整个应用程序的FlushMode更改为COMMIT,而不是MANUAL。不过,如果您要对不想写入数据库的托管实体进行更改,而不仅仅是一个bandaid,那么这是修复程序。 – Affe

5

Hibernate中的一个脏会话是当你在会话中加载一个对象然后修改它的时候。

或者,当您打开会话并创建一个新对象时。

即使你没有可明确调用任何插入/更新操作时,Hibernate标志着会话当会话关闭

2

简而言之:我们知道脏数据是尚未提交的数据。以同样的方式,hibernate中的dirty会话包含尚未提交的已修改数据。