在我的Spring MVC应用程序中发生错误时,脚轮试图映射懒惰初始化的对象。如何映射Castor库中的惰性初始化对象?
我有关系的一个实体类很多:
@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.
@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);
}
的在这两种方法蓖麻映射返回的对象,并尝试映射场b_set。在第一种方法中有懒惰的初始化。
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: package.A.b_set, no session or session was closed
我理解这个错误,但我不知道如何解决聪明的方式这样的情况:当我用第一种方法,因为蓖麻油无法映射场b_set出现问题。我想要有两种方法。
我使用Spring 3.1.0版本,1.3.2蓖麻和休眠-的EntityManager 3.6.8最终
我将是帮助表示感谢。
这不是解决方案,我的预期。如果我理解正确,Open Session用于从数据库中读取缺失的对象(在我的检查中从数据库中读取b_set)。正如我写的,我想提升两种方法,一种是渴望的,另一种是懒惰的初始化。 Collection b_set非常大,所以当我不需要时,我不想从数据库中选择很多记录,将它们映射到对象然后映射到xml并通过http发送。最好的解决方案是告诉castor在第一个带有延迟初始化的方法被调用时不映射字段b_set。但我不知道该怎么做。 – Mariusz 2012-08-13 14:29:03