Исключение Lazy init в транзакциях EJB - PullRequest
0 голосов
/ 23 апреля 2020

Я новичок в java EJB и Hibernate, и у меня проблема с Libery Initalization в Hibernate. В основном у меня есть и 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 Ответ

1 голос
/ 29 апреля 2020

Во-первых, EJB должны быть введены. Никогда не создавайте их с помощью ключевого слова new (). Используйте аннотацию @Inject для этого. Поэтому в MyEjbService используйте @Inject для MyDao.

В MyServiceClass вы находитесь за пределами транзакции. Вы можете использовать PersistenceContextType.EXTENDED, но лучше инициализировать все атрибуты LAZY в EJB напрямую (JOIN FETCH, если атрибут ленивый, или аннотировать этот атрибут с помощью FetchType.EAGER).

...