Hibernate EJB事务中的延迟初始化异常
我不熟悉JavaEJB和Hibernate,我对实体的Hibernate惰性初始化有一个问题。基本上,我有和DAO,它进行DB调用,我有两层服务。所以,我的问题是,为什么我能够访问DAO层正上方的服务中的延迟获取集合,但无法从调用DAO之前的第二个服务的服务中访问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()
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注释该属性)