Спящая ленивая загрузка требует транзакции EJB? - PullRequest
2 голосов
/ 29 июня 2011

При попытке оптимизировать транзакции в моем проекте java ee 6 с помощью hibernate, я попытался сделать то же самое, что и с Eclipselink, и отключил транзакции для запросов только для чтения, как показано ниже:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public User fetchUser(Integer id){
    User u = em.find(User.class, id);
    u.getRoleList().size();
    return u;
}

Inhibernate, это выдает и исключение при попытке прочитать роли пользователя, утверждая, что сессия уже закрыта.Действительно ли отложенная загрузка в спящем режиме требует полноразмерной транзакции EJB только для чтения данных?

1 Ответ

2 голосов
/ 29 июня 2011

Короче, да.

В любом случае, иметь сделку - хорошая идея, потому что

  • это гарантирует, что оба запроса (один для em.find и один для отложенной загрузки) видят базу данных в одном и том же состоянии: при втором чтении не видно что-то зафиксированное сразу после первого, например.
  • делает сеанс активным на время транзакции, что оптимизирует загрузку, поскольку может повторно использовать объекты, кэшированные в сеансе, избегать загрузки одного и того же объекта несколько раз и т. Д.
...