Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate/Spring:在单元测试中将集合与两个打开的会话关联的非法尝试_Spring_Hibernate - Fatal编程技术网

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

Hibernate/Spring:在单元测试中将集合与两个打开的会话关联的非法尝试,spring,hibernate,Spring,Hibernate,我在单元测试中看到了上面的错误,我不知道如何纠正它 我的单元测试类扩展了AbstractTransactionalDataSourceSpringContextTests并执行以下操作: // Retrieve a RuleGroup RuleGroup ruleGroupToUpdate = ruleGroupDao.findRuleGroup(a, b, c, d); // Update an encapsulated Attribute // Save the RuleGroup rule

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

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

// Retrieve a RuleGroup
RuleGroup ruleGroupToUpdate = ruleGroupDao.findRuleGroup(a, b, c, d);
// Update an encapsulated Attribute
// Save the RuleGroup
ruleGroupDao.updateRuleGroup(ruleGroupToUpdate);
下面是我的规则组映射文件的一个片段。如您所见,规则组包含封装的规则和属性集合,默认情况下这两个集合都是延迟加载的:

<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>


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


希望这能有所帮助。

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


希望能有所帮助。

谢谢您的回复。如果我不希望在DAO级别指定@Transactional,我还有什么其他选项?如果我在没有HibernteTemplate的情况下使用Hibernate,这会避免创建新会话吗?只是为了指定我的修复。我删除了AbstractTransactionalDataSourceSpringContextTests,并使用了Spring3单元测试支持,从而在我的每个单元测试上指定了@Transactional注释。因此,这在我的单元测试中提供了事务性支持,错误不再发生。谢谢谢谢你的回复。如果我不希望在DAO级别指定@Transactional,我还有什么其他选项?如果我在没有HibernteTemplate的情况下使用Hibernate,这会避免创建新会话吗?只是为了指定我的修复。我删除了AbstractTransactionalDataSourceSpringContextTests,并使用了Spring3单元测试支持,从而在我的每个单元测试上指定了@Transactional注释。因此,这在我的单元测试中提供了事务性支持,错误不再发生。谢谢