2

私のSpring MVCアプリケーションでは、キャスターが遅延初期化されたオブジェクトをマップしようとするとエラーが発生します。

私は1対多の関係を持つEntityクラスを持っています:

@Entity
@Table(name = "a")
public class A implements Serializable {

    ...
    private Set<B> b_set=new HashSet<B>();

    @OneToMany(mappedBy = "a", cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.LAZY)
        public Set<b> getB_set() {
            return b_set;
        }
}

多対一の関係を持つエンティティ

@Entity
@Table(name = "b")
public class B implements Serializable {
    ...
    @ManyToOne
    @JoinColumn(name = "fk", insertable=false, updatable=false)
    private A a;
}

Castor ライブラリを使用して、オブジェクトを xml にマップします。

<mapping>
    <class name="package.a">

        ...
        <field name="b_set" type="package.b" collection="set">
            <bind-xml name="b_name" node="element"></bind-xml>
        </field>

    </class>

    <class name="package.b">
        ...
    </class>
</mapping>

エンティティ A には多くのエンティティ B があるため、2 つのオプションがあります。コントローラーは、遅延初期化でエンティティ A を返すことができ、B のセットで A を返すこともできます。

@RequestMapping(value = "/name/{name}", method = RequestMethod.GET)
    @ResponseBody
    public A findAByName(@PathVariable String name) {
        return aService.findByName(name);
    }

    @RequestMapping(value = "/b/{name}", method = RequestMethod.GET)
    @ResponseBody
    public A findAByNameWithB(
            @PathVariable String name) {
        return aService.findByNameWithB(name);
    }

どちらの方法でも、Castor は返されたオブジェクトをマップし、フィールド b_set をマップしようとします。最初の方法では、遅延初期化があります。キャスターがフィールド b_set をマップできないため、最初の方法を使用すると問題が発生します。

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: package.A.b_set, no session or session was closed

このエラーは理解できますが、この状況を賢く解決する方法がわかりません。私は両方の方法を持ちたいです。

Spring 3.1.0 Release、castor 1.3.2、および hibernate-entitymanager 3.6.8 Final を使用しています

私は助けに感謝します。

4

1 に答える 1

0

これは、HTTP 応答が完了する前に hibenrate セッションが閉じられたために発生します。

それを解決するには、次のことができます。

1) コレクションを EAGER としてマークします。2) Open Session In View パターンを使用します。

詳細については、こちらをご覧ください。

https://community.jboss.org/wiki/OpenSessionInView

Spring には、すぐに使用できる Open Session In View ソリューションが付属しています。これは非常に使いやすいです:

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/orm/hibernate3/support/OpenSessionInViewInterceptor.html

于 2012-08-13T08:15:37.720 に答える