EJB事务中的懒惰初始异常

问题描述 投票:0回答:1

我是java EJB和Hibernate的新手,我对Hibernate懒惰初始化实体有一个问题。基本上,我有一个DAO,它使一个DB调用和我有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){
         ...
     }
}
hibernate jpa lazy-initialization
1个回答
1
投票

首先,EJBs必须被注入。千万不要用new()关键字来创建它们。使用@Inject注解来创建。所以在MyEjbService中使用@Inject来表示MyDao。

在MyServiceClass中,你已经脱离了事务边界。你可以使用PersistenceContextType.EXTENDED,但最好直接初始化EJB中的所有LAZY属性(如果属性是懒惰的,就JOIN FETCH,或者用FetchType.EAGER注释该属性)。

© www.soinside.com 2019 - 2024. All rights reserved.