Hibernate EJB事务中的延迟初始化异常

Hibernate EJB事务中的延迟初始化异常,hibernate,jpa,lazy-initialization,Hibernate,Jpa,Lazy Initialization,我不熟悉JavaEJB和Hibernate,我对实体的Hibernate惰性初始化有一个问题。基本上,我有和DAO,它进行DB调用,我有两层服务。所以,我的问题是,为什么我能够访问DAO层正上方的服务中的延迟获取集合,但无法从调用DAO之前的第二个服务的服务中访问 public MyServiceClass { public MyData myService(int id) { MyEjbService myEjbService = new MyEjbService()

我不熟悉JavaEJB和Hibernate,我对实体的Hibernate惰性初始化有一个问题。基本上,我有和DAO,它进行DB调用,我有两层服务。所以,我的问题是,为什么我能够访问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){
         ...
     }
}

首先,必须注入EJB。永远不要使用new()关键字创建它们。使用@InjectAnnotation来实现这一点。因此,在MyEjbService中,为MyDao使用@Inject

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