2012-01-18 2 views
0

В моей реализации JPA я делаю em.find(), чтобы выбрать список объектов и изменить эти объекты. Далее я обновляю эти измененные объекты, вызывающие em.merge() внутри транзакции (TX чтобы сохранить другие связанные вещи).Стратегия поиска и обновления JPA

Это отлично работает, за исключением того, что SELECT происходит дважды (один раз во время поиска и других во время другого), который, как я считаю, является избыточным и работоспособным в моем случае.

Я бы с неохотой привел find() в пределах границы транзакции em.merge(), даже если это решит последний SELECT.

Определяет мой собственный NamedQuery единственный способ обновить эти объекты, не выдавая другой SELECT?

Благодаря

+0

Можете ли вы указать, где происходит второй SELECT? – perissf

+0

Почему вы неохотно приносите вызов find() в свой tran? Какой провайдер вы используете? – Rick

+0

@Rick Select занимает несколько минут для выполнения (из-за запроса без индексирования столбцов). Дополнительное время для выбора времени выполнения транзакции (ограничение JBOSS составляет 5 мин). Я мог бы увеличить время, но сохраняя это как последний параметр resport. – phewataal

ответ

0

Если вы используете JTA удалось EntityManager, то каждая граничная сделка будет новый контекст сохранения, и если вы не общий кэш настроен, вам придется вернуться в базу данных.

Какой провайдер JPA вы используете? Если вы используете EclipseLink, общий кеш включен по умолчанию.

Для транзакций JPA, если вы используете один и тот же EntityManager для поиска и слияния, он все равно должен находиться в контексте сохранения.

+0

Я использую Hibernate в качестве поставщика JPA. В моем коде Entityymanager определяется как переменная экземпляра в DAO.DAO ссылается на @EJB в моем компоненте, содержащем бизнес-логику. Здесь я вызываю dao.find() и dao.merge(). Означает ли это, что я использую разные ЭМ для каждого вызова dao? – phewataal

 Смежные вопросы

  • Нет связанных вопросов^_^