2012-08-13 82 views
2

在我的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最终

我将是帮助表示感谢。

回答

0

这是因为您的Hibenrate会话在您的HTTP响应完成之前已关闭。

为了解决它,你可以做到以下几点:

1)标记集合作为跃跃欲试。 2)使用Open Session In View模式。

你可以阅读更多关于它在这里:

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

春天来与开箱开放会议在View解决方案。这是非常容易使用:

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

+0

这不是解决方案,我的预期。如果我理解正确,Open Session用于从数据库中读取缺失的对象(在我的检查中从数据库中读取b_set)。正如我写的,我想提升两种方法,一种是渴望的,另一种是懒惰的初始化。 Collection b_set非常大,所以当我不需要时,我不想从数据库中选择很多记录,将它们映射到对象然后映射到xml并通过http发送。最好的解决方案是告诉castor在第一个带有延迟初始化的方法被调用时不映射字段b_set。但我不知道该怎么做。 – Mariusz 2012-08-13 14:29:03