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()を使用してクエリを実行します。ルールと属性は、「結合」フェッチを使用して取得されます
  • updateRuleGroupメソッドは、getHibernateTemplate()。update()を使用して更新を実行します

    テストのデバッグから、新しいセッションがfindRuleGroupメソッドで作成され、次にupdateRuleGroupメソッドで作成されます。したがって、更新が実行されると、Hibernateは私の属性コレクションがすでにfindRuleGroupセッションに関連付けられていることを確認し、例外をスローします。

    これを解決するにはどうすればよいですか?おそらく、更新によって新しいセッションが開かれることはありません。HibernateTemplateが新しいセッションを作成しないように指定すると、スレッドに関連付けられたセッションがないという別の例外が発生します。私はここで途方に暮れています!

  • 4

    1 に答える 1

    1

    取引は一切ないと思います。getHibernateTemplate()は、新しいセッションを開くことができます。ここのsrcコードを参照してください:bit.ly/HsgDrR。一般的な方法は、Springの@Transactionalアノテーションを使用して、トランザクション内のdaoのメソッドをラップすることです。これを行わないと、getSession()以外を呼び出すと、トランザクションの外部で新しいセッションが開かれ、リークが発生する可能性があります。

    お役に立てば幸いです。

    于 2012-04-15T17:08:45.830 に答える