EJB事务中的惰性初始化异常

时间:2020-04-23 18:02:46

标签: hibernate jpa lazy-initialization

我是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){
         ...
     }
}

1 个答案:

答案 0 :(得分:1)

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

在MyServiceClass中,您不在事务边界之内。您可以使用PersistenceContextType.EXTENDED,但最好直接在EJB中初始化所有LAZY属性(如果属性是惰性的,则可以使用JOIN FETCH或使用FetchType.EAGER对该属性进行注释)。

相关问题