我是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){
...
}
}
答案 0 :(得分:1)
首先,必须注入EJB。切勿使用new()关键字创建它们。为此使用@Inject注释。因此,在MyEjbService中,将@Inject用于MyDao。
在MyServiceClass中,您不在事务边界之内。您可以使用PersistenceContextType.EXTENDED,但最好直接在EJB中初始化所有LAZY属性(如果属性是惰性的,则可以使用JOIN FETCH或使用FetchType.EAGER对该属性进行注释)。