2014-02-11 51 views
0

我得到一个LazyInitializationException,我不知道为什么。我将一个实体(BaseEntity with id)作为数据存储在primefaces树节点上,以使其成为动态的(即onNodeExpand事件处理程序从db中获取展开的节点子节点)。我知道,实体变为分离后的渲染这就是为什么我不中onNodeExpand下面添加子节点:旧的“org.hibernate.LazyInitializationException ...无法初始化代理 - 没有会话”:不明白为什么

Product parentProduct = productService.findById(entity.getId()); 

这回,我认为会被“附加”的实体,但当我遍历延迟加载一对多的关系我得到LazyInitializationException中:

for (Module module: parentProduct.getModules()) { 

我不理解的是什么?

编辑:

ProductService是@Stateless EJB注入如下成ViewScoped豆:

@Named 
@ViewScoped 
public class MasterBean implements Serializable { 
    private static final long serialVersionUID = 3153934047649103375L; 

    TreeNode root; 

    @EJB 
    ProductRepo productService; 

findById是一个通用的CrudRepository:

public E findById(final K id) { 
      return em.find(entityClass, id); 
    } 
+0

这与您处理交易的方式有关。向我们展示加载“parentProduct”并使用其模块的代码,我们会告诉你什么是错误的。 –

+0

嗨Ean:编辑并添加更多信息。 – dashambles

回答

0

我和我正在开发的系统有完全相同的问题。要解决这个问题,你必须做的就是获取包含集合对象,然后访问同一个会话中收集这样的:

@Transactional 
public User retrieveUser(String username) 
{ 
    User user = hibernateUserDao.getUserByUsername(username) 
    /*whatever your method of getting something from the database */ 

    Collection collection = user.getCollection(); 
    /*Then you can access and manipulate the collection object*/ 
} 

此,如果您检索的用户对象,因为造成的,收集默认情况下不会因为性能原因而被检索,但是如果您在一个事务中执行了所有操作,那么数据库连接仍然存在,因此休眠将继续并检索集合的实例。

另一个缺陷是尝试在一个事务中检索用户,然后开始一个新的访问您的集合对象。 Hibernate不会让你这样做,它会抛出类似的错误。

告诉我,如果这没有意义。

TL; DR:您必须检索您的父对象,然后在同一事务会话中访问您的集合对象。

+0

嗨詹姆斯:这确实是解决方案,虽然它需要进一步的研究来了解我的误解。我的错误是,我认为这是因为两个方法都是REQUIRES_NEW,为第一个方法创建的新事务正在传播到第二个方法。不是这种情况。从Enterprise JavaBeans的书中:“新事务的范围只覆盖必需的EJB和它所访问的所有其他EJB。一旦在Required EJB上调用的方法完成,新事务的范围就结束了。 – dashambles

+0

啊是的。使用所有Spring @Transactional注解,我甚至不会打扰定义REQUIRES_NEW或任何其他隔离级别。 Hibernate非常聪明,可以自己解决问题。至少这是我的经历。 – JamesENL

0

如果”在产品和模块之间没有显式定义FetchType的情况下获得OneToMany关系,那么获取类型by default is Lazy。如果是这样的话,那么你需要确保你正在Hibernate会话中迭代延迟加载的集合。

在Hibernate会话中,可以定义Hibernate会话的分界线,特别是当您使用库/框架时,会发挥很多作用。我不熟悉primefaces,但是如果你使用read up on Hibernate sessions here,那么你可能会看到Hibernate会话如何与它一起工作。

相关问题