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

Hibernate/Spring:在单元测试中非法尝试将集合与两个打开的会话相关联

孔和畅
2023-03-14

我在我的单元测试中看到了上面的错误,并且不知道如何纠正它。

我的单元测试类扩展了abstracttransactiondatasourcespringcontexttests并执行以下操作:

// Retrieve a RuleGroup
RuleGroup ruleGroupToUpdate = ruleGroupDao.findRuleGroup(a, b, c, d);
// Update an encapsulated Attribute
// Save the RuleGroup
ruleGroupDao.updateRuleGroup(ruleGroupToUpdate);

下面是我的规则组映射文件的一个片段。如您所见,RuleGroup封装了规则和属性集合,默认情况下这两者都是延迟加载的:

<class name="a.b.c.d.RuleGroup" table="RULE_GROUP">
    <id name="ruleGroupID" column="RULE_GRP_ID">
        <generator class="increment"/>
    </id>
    <set name="rules" lazy="true" cascade="save-update" table=RULES">
        <key column="RULE_GRP_ID" not-null="false"/>
        <many-to-many unique="true" column="RULE_ID" class="a.b.c.d.Rule"/>
    </set>
    <set name="attributes" lazy="true" cascade="save-update" table="ATTRIBUTES">
        <key property-ref="xrefID" column="XREF_ID" not-null="true"/>
        <many-to-many unique="true" column="CONFIG_ATTR_ID" class="a.b.c.d.Attribute"/>             
    </set>
</class>

我的DAO类扩展了HibernateDaoSupport:

通过调试我的测试,在findRuleGroup方法中创建了一个新会话,然后在updateRuleGroup方法中再次创建。因此,当执行更新时,HiberNate会看到我的属性集合已经与findRuleGroup会话相关联,并抛出异常。

我该如何解决此问题?据推测,更新不应打开新会话。如果我指定 HibernateTemplate 不应创建新会话,则会出现一个不同的异常,指出没有与线程关联的会话。我在这里不知所措!

共有1个答案

贺聪
2023-03-14

我认为你根本没有交易。getHibernateTemplate()可以打开一个新会话。请参见此处的src代码:bit.ly/HsgDrR。一种常见的做法是使用spring的@Transactional注释在事务中包装dao中的方法。如果不这样做,调用getSession()以外的任何方法都会导致新会话在事务外部打开并泄漏。

希望有帮助。

 类似资料:
  • 我使用Hibernate和Spring,我在执行以下代码时得到这个异常: 我已经阅读了一些关于Hibernate的会话管理,我有一种预感,这段代码的会话处理很差。举行两次公开会议的原因可能是什么?Hibernate API表示函数返回一个新的会话对象或现有的会话对象。在这种情况下,它从哪里获取现有会话对象?如果它创建了一个新的会话对象,那么处理所涉及的集合仍然可以吗? 任何帮助将不胜感激。提前感谢

  • 我试图更新MySql数据库中的记录。更新时引发了以下异常 我检查会话。它关闭在每个方法的最后块中。无法弄清楚出了什么问题。我能够毫无问题地使用其他方法插入更新操作,但只有保存更新用户豆方法抛出异常 UserDAOImpl: 服务输入: applicationContext.xml: 我能够使用相同的配置执行所有数据库操作,但当我从serviceImpl调用块用户()方法时,它调用DAO方法,并且S

  • 在我当前的 spring 项目中,当我的应用程序尝试执行此方法时: 我得到了这个错误: 我的Dao类(插入方法的位置)是这样的: 我还尝试在Dao类中的insert、update和delete方法以及在服务类中使用它们的方法中添加注释@Transaction,但同样的问题也会发生。 有人能看出我做错了什么吗? ps.:我试图保存的实体类是:

  • 那么,除了避免使用jackson-hibernate-mapper进行测试之外,还有什么方法可以避免这个问题吗?使用DTO和Dozer代替domain object不被认为是一种解决方案(将来会这样做,但不是现在)。 提前致谢

  • 我在Hibernate4中使用JTA事务管理器。有人知道这个问题吗?在执行刷新时,我面临错误。 下面是我面临上述问题的一段代码。 XML:

  • 在Spring Boot应用程序中,我访问Hibernate会话,如下所示:https://stackoverflow.com/a/33881946/272180 我的单元测试类类似于以下自动取款机: 引用具有用于运行Spring Boot应用程序的main方法的类。