在我的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个选项。控制器可以使用惰性init返回实体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);
}
在这两种方法中,Castor贴图返回了对象并尝试映射字段b_set。在第一种方法中,存在延迟初始化。当我使用第一种方法时出现问题,因为castor无法映射字段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
我将不胜感激。
答案 0 :(得分:0)
这是因为你的hibenrate会话在你的HTTP响应完成之前就已经关闭了。
要解决此问题,您可以执行以下操作:
1)将标记收集为EAGER。 2)在View模式中使用Open Session。
您可以在此处详细了解:
https://community.jboss.org/wiki/OpenSessionInView
Spring开箱即用Open View In View解决方案。这很容易使用: