私の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 を使用しています
私は助けに感謝します。