Hibernate 如何在Castor库中映射惰性初始化对象?
在我的SpringMVC应用程序中,castor尝试映射惰性初始化的对象时发生错误 我有一对多的实体类:Hibernate 如何在Castor库中映射惰性初始化对象?,hibernate,spring-mvc,castor,Hibernate,Spring Mvc,Castor,在我的SpringMVC应用程序中,castor尝试映射惰性初始化的对象时发生错误 我有一对多的实体类: @Entity @Table(name = "a") public class A implements Serializable { ... private Set<B> b_set=new HashSet<B>(); @OneToMany(mappedBy = "a", cascade = CascadeType.ALL, orphan
@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;
}
}
我使用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>
在这两种方法中,Castor映射返回的对象并尝试映射字段b_集。第一种方法是延迟初始化。使用第一种方法时出现问题,因为castor无法映射字段b_集:
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版本、castor 1.3.2和hibernate entitymanager 3.6.8最终版本
我将非常感谢您的帮助。这是因为您的hibenrate会话在HTTP响应完成之前已关闭 要解决此问题,您可以执行以下操作: 1) 将收藏标记为渴望。 2) 使用“在视图中打开会话”模式 您可以在此处阅读更多信息: Spring提供了开箱即用的开放会话视图解决方案。这非常容易使用:
之所以发生这种情况,是因为您的hibenrate会话在HTTP响应完成之前已关闭 要解决此问题,您可以执行以下操作: 1) 将收藏标记为渴望。 2) 使用“在视图中打开会话”模式 您可以在此处阅读更多信息: Spring提供了开箱即用的开放会话视图解决方案。这非常容易使用:
这不是我所期望的解决方案。若我理解正确,OpenSession用于从数据库中读取缺少的对象(在我的示例中,用于从数据库中读取b_集)。正如我所写的,我想使用两种方法,一种是使用eager,另一种是使用lazy初始化。集合b_集非常大,所以当我不需要时,我不想从数据库中选择大量记录,将它们映射到对象a,然后映射到xml并通过http发送。最好的解决方案是告诉castor在调用第一个具有延迟初始化的方法时不要映射字段b_集。但我不知道怎么做。这不是我所期望的解决方案。若我理解正确,OpenSession用于从数据库中读取缺少的对象(在我的示例中,用于从数据库中读取b_集)。正如我所写的,我想使用两种方法,一种是使用eager,另一种是使用lazy初始化。集合b_集非常大,所以当我不需要时,我不想从数据库中选择大量记录,将它们映射到对象a,然后映射到xml并通过http发送。最好的解决方案是告诉castor在调用第一个具有延迟初始化的方法时不要映射字段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);
}
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: package.A.b_set, no session or session was closed