1

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

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

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

以下是我的 RuleGroup 映射文件的片段。可以看到,一个 RuleGroup 已经封装了 Rule 和 Attribute 集合,这两个集合默认都是惰性加载的:

<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 方法使用 getSession().createCriteria() 来执行查询。使用“join”提取来检索规则和属性
  • updateRuleGroup 方法使用 getHibernateTemplate().update() 来执行更新

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

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

  • 4

    1 回答 1

    1

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

    希望有帮助。

    于 2012-04-15T17:08:45.830 回答