JPA NamedQuery не принимает изменения в измененном объекте - PullRequest
1 голос
/ 02 июня 2009

У меня есть метод, который извлекает сущности, используя NamedQuery. Я обновляю значение каждой сущности, а затем запускаю другой именованный запрос (в том же методе и Transaction), фильтрующий по старому значению, и он возвращает те же сущности, как если бы я их не изменял.

Я понимаю, что EntityManager необходимо сбросить, а также, что это должно происходить автоматически, но это не имеет значения.

Я включил ведение журнала в спящем режиме SQL и вижу, что сущности не обновляются, когда я вызываю flush, но когда транзакция контейнера фиксируется.

EntityManager entityManager = getPrimaryEntityManager();
MyEntity myEntity = entityManager.find(MyEntityImpl.class, allocationId);
myEntity.setStateId(State.ACTIVE);
// Flush the entity manager to pick up any changes to entity states before we run this query.
entityManager.flush();
Query countQuery = entityManager
        .createNamedQuery("MyEntity.getCountByState");
// we're telling the persistence provider that we want the query to do automatic flushing before this
// particular query is executed.
countQuery.setParameter("stateId", State.CHECKING);
Long count = (Long) countQuery.getSingleResult();
// Count should be zero but isn't. It doesn't see my change above

Ответы [ 2 ]

1 голос
/ 02 июня 2009

Если честно, я не так хорошо знаком с JPA, но столкнулся с похожими проблемами с менеджером сессий Hiberate. Мое исправление заключалось в том, чтобы вручную удалить указанный объект из сеанса Hibernate перед повторным запросом, поэтому он вынужден выполнить поиск из базы данных и не получить объект из кэша. Вы можете попробовать сделать то же самое с EntityManager JPA.

0 голосов
/ 27 декабря 2013

У меня была та же проблема, и я обнаружил две вещи:

  • Во-первых, вы должны проверить FlushMode для контекста постоянства и / или запрос.
  • Во-вторых, убедитесь, что менеджер сущностей один и тот же объект для управления транзакциями и запроса выполнение. В моем случае у меня был шпион Mockito на entityManager, который было достаточно, чтобы сломать управление транзакциями.
...