我在单元测试中看到了上述错误,不知道如何纠正它。
我的单元测试类扩展了 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 方法中创建了一个新 Session,然后在 updateRuleGroup 方法中再次创建。因此,当执行更新时,Hibernate 看到我的 Attribute 集合已经与 findRuleGroup 会话相关联并抛出异常。
我该如何解决这个问题?据推测,更新不应打开新会话。如果我指定 HibernateTemplate 不应该创建新会话,那么我会得到一个不同的异常,说没有与线程关联的会话。我在这里不知所措!