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

Java HibernateTemplate findByCriteria和Get之间在hibernate会话状态上的差异,java,spring,hibernate,spring-orm,Java,Spring,Hibernate,Spring Orm,我有以下奇怪的行为 我有一些在开始之前创建TestValue的测试用例。 首先,创建主实体并使用测试值ID保存。 为此,我使用Springs HibernateTemplate的saveOrUpdate 然后在中创建一些子对象并附加到此对象 儿童收藏。在hbm.xml中有cascade=save update 这些子对象在该点没有指定ID 然后调用另一个saveOrUpdate 在我的实体上,每次保存或更新时,都会保存一个额外的审核条目 在数据库中。为此,每次创建DetachedCriteria

我有以下奇怪的行为

我有一些在开始之前创建TestValue的测试用例。 首先,创建主实体并使用测试值ID保存。 为此,我使用Springs HibernateTemplate的saveOrUpdate

然后在中创建一些子对象并附加到此对象 儿童收藏。在hbm.xml中有cascade=save update 这些子对象在该点没有指定ID

然后调用另一个saveOrUpdate

在我的实体上,每次保存或更新时,都会保存一个额外的审核条目 在数据库中。为此,每次创建DetachedCriteria时 按用户名搜索当前用户并在审核条目中引用它。 直到这一点,一切都很好。每个子对象都会分配一个ID

经过一些分析,我发现这个DetachedCriteria需要很多时间 并决定更改它,以便我可以通过id从HibernateTemplate通过get方法访问用户,这将更加高效

但我知道有些奇怪的事情发生了。对具有子项的实体的saveOrUpdate不会生成子项的ID,而且看起来根本不会保存子项

正如我在这里读到的,HibernateTemplate saveOrUpdate不同于持久化,因此它可以在任何事务之外使用,这将导致上述行为,即映射集合在刷新之前不会被保存。 所以我不明白的是,为什么在HibernateTemplate中使用带有分离标准的findByCriteria时会出现不同的行为

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


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

所以我想我找到了问题所在。 使用SaveOrUpdate并立即为子集合生成id的TestValues的旧代码只是偶然工作的

在findByCriteria期间,将调用方法列表,该列表将转到Hibernate的SessionImpl,其中在AutoFlushif中调用刷新。在该方法中,会话被刷新,分离的子进程获得其ID

当我将findByCriteria更改为HibernateTemplate的get方法时,不会调用此列表方法,因此不会调用刷新

因此,我在saveOrUpdate之后对会话进行了手动刷新,并在此时生成了ID