首页 > 解决方案 > EJB 事务中的惰性初始化异常

问题描述

我是 java EJB 和 Hibernate 的新手,我对实体的 Hibernate Lazy Initalization 有疑问。基本上我有和 DAO 进行数据库调用,我有 2 层服务。所以我的问题是为什么我能够在 DAO 层上方的服务中访问延迟获取的集合,但无法从调用 DAO 之前的第二个服务的服务访问。

public MyServiceClass {
    public MyData myService(int id) {
         MyEjbService myEjbService = new MyEjbService();
         MyData mydata = myEjbService.getMyData(id);
         return mydata;   // here i cannot reach the collection object of the entity, lazy init exception
    }
}

public MyEjbService
{
     public MyData getMyData(int id){
         MyDao myDao = new MyDao();
         MyData myData = myDao.getData(id);
         return myData; // here I can see and reach collection objects inside of the entity
     }
}


@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public MyDao{

     @TransactionAttribute(TransactionAttribute.SUPPORT)
     public MyData getData(int id){
         ...
     }
}

标签: hibernatejpalazy-initialization

解决方案


首先,必须注入 EJB。切勿使用 new() 关键字创建它们。为此使用@Inject 注释。因此,在 MyEjbService 中,对 MyDao 使用 @Inject。

在 MyServiceClass 中,您超出了事务边界。您可以使用 PersistenceContextType.EXTENDED,但最好直接在 EJB 中初始化所有 LAZY 属性(如果属性是惰性的,则加入 FETCH 或使用 FetchType.EAGER 注释该属性)。


推荐阅读