当前位置: 首页 > 知识库问答 >
问题:

HibernateTemplate findByCriteria和Get之间的hibernate会话状态差异

尉迟景福
2023-03-14

我有以下奇怪的行为。

我有一些testcases在开始之前会创建TestValues。首先,创建主实体,并将其与测试值ID一起保存。为此,我使用Springs HibernateTemplate中的saveOrUpdate。

然后创建一些子对象并将其附加到子集合中的此对象。(在hbm.xml中具有cascade=“save-update”)这些子对象在该点没有分配ID。

则调用一个附加的saveOrUpdate。

在我的实体上的每个saveOrUpdate中,都将在数据库中保存一个额外的审核条目。为此,每次都创建一个DetachedCriterial,它按用户名搜索当前用户,并在审核条目中引用它。在那之前一切正常。每个子对象都会分配一个ID。

经过一些分析之后,我发现这个DetachedCriteria花费了很多时间,并决定对它进行更改,这样我就可以通过HibernateTemplate的get方法访问用户,通过id来访问用户,这样效率会高得多。

正如我在这里读到的http://www.journaldev.com/3481/hibernate-save-vsaveorupdate-vspersist-vsmerge-vsupdate-explacement-with-examples一样,HibernateTemplate saveOrUpdate与persistent不同,因此它可以在任何事务之外使用,这将导致上述行为,即映射的集合在被刷新之前不会被保存。所以我不明白的是,当我在HibernateTemplate中使用findByCriteria和detachedCriteria时,为什么会有不同的行为。

调用findByCriteria是否会调用会话的刷新,或者为什么调用get而不是findByCriteria时会有不同的hibernate会话状态。在auditentry、用户帐户和在创建测试值期间保存的实体之间没有直接引用。

PS:我知道现在不推荐使用HibernateTemplate。但它是一个旧的应用程序,完全替换它需要太多的时间。

共有1个答案

袁泰平
2023-03-14

所以我想我找到问题所在了。带有TestValues的旧代码使用SaveOrUpdate并为children集合立即生成ID,这只是偶然的情况。

在findByCriteria过程中,调用方法列表,该列表将转到Hibernate的SessionImpl,在Hibernate的SessionImpl中,在autoFlushIfRequired中调用一个flush。在该方法期间,会话将被刷新,分离的子级将获得他们的ID。

当我将findByCriteria更改为HibernateTemplate的get方法时,不会调用这个list()方法,因此不会调用flush。

所以我在saveOrUpdate之后对会话进行了手动刷新,此时就生成了ID。

 类似资料:
  • 我正在学习j2ee,如果问题看起来很基本请原谅。 在httpsession中,会话ID存储在客户端,与之相关的数据存储在服务器端。 现在,当我在POJO上使用CDI@SessionScoped时,这是否意味着EJB容器(?)在会话中存储pojo。(Session.SetAttribute(POJO)) CDI可以区分SFB、SLB和POJO吗?

  • 在4.3.0.Final版的hibernate文档中,提供了以下代码段来创建会话工厂: 这似乎已经过时,因为方法buildSessionFactory()已被弃用。创建会话工厂的正确方法是什么?

  • 我正在尝试使用Spring和DBunit测试我的代码(http://springtestdbunit.github.io/) 一旦进入单元测试: 将返回DBUnit插入的实体列表,因此它确实在数据库(MYSQL)中插入了记录。 但是: 将返回false!它无法使用无状态会话找到任何记录。 之前,我使用Liquibase插入相同的记录,这段代码工作得很好。 使用HSql更糟糕的是,它在尝试打开无状态

  • 问题内容: 有状态会话bean和HTTP会话之间有什么关系吗?我们将需要有状态会话Bean的用例是什么,而HTTP会话需要哪些用例。我可以将有状态会话Bean公开为静态Web服务吗? 问题答案: HTTP是一种无状态协议, 这意味着 它是服务器和客户端之间的实际传输协议- 是“无状态的, 因为它在调用之间不记得任何东西。 现在,首先阅读一下什么是HTTPSession和什么是Session Bea

  • 我正在Ubuntu 16.04 LTS中使用Python 2.7.12。我正在通过以下链接学习如何使用boto3:https://boto3.readthedocs.io/en/latest/guide/quickstart.html#using-博托-3。我的疑问是何时使用资源、客户端或会话,以及它们各自的功能。

  • 线程状态WAIT和线程状态BLOCKED有什么区别? 线。国家文件: Blocked 等待监视器锁而被阻塞的线程处于这种状态。 等待 无限期等待另一个线程执行特定操作的线程处于此状态 这不能向我解释差异。