2015-03-05 2 views
0

Я работаю с Eclipselink в качестве поставщика JPA. Следующий код используется для доступа субъектов из базы данных:Кэш Eclipselink - сохранение одного и того же объекта по транзакциям

em.merge(anEntity); 
    em.getTransaction().commit(); 
    em.getTransaction().begin(); 
    anEntity2 = em.find(targetClass, anEntity.getId()); 

Есть ли способ, чтобы гарантировать, что объект anEntity == anEntity2 будет держать, что всегда такой же ссылка на объект возвращается? Например, каким-то образом настройка кэша Eclipselink всегда возвращает один и тот же объект?

ОБНОВЛЕНИЕ Я прочитал следующее:

В JPA идентификатор объекта поддерживается в рамках транзакции, и (обычно) в пределах одной и той же EntityManager. Исключение составляет управляемый EntityManager, управляемый Java EE, идентификация объекта поддерживается только внутри транзакции.

Источник: link

Мой вопрос заключается в следующем: в среде Java EE, по сделкам, (с помощью переменных в ссылке) делает assert (employee1 == employee2); удержание? Если нет, возможно ли как-то обойти это ограничение?

+0

Я не уверен в вопросе, как если бы вы использовали один и тот же контекст EntityManager, он поддерживает контекст всех управляемых объектов в течение его жизни - если вы не вызываете em.clear(). Вы используете em.merge, поэтому, возможно, ваш экземпляр anEntity не является управляемым экземпляром первой транзакции? Если не используется anEntity = em.merge (anEntity); – Chris

+0

Добавлено уточнение – krisy

ответ

1

Как указано в ссылке, единственным исключением является управляемый entityManager Java EE, поскольку контейнер должен контролировать жизненный цикл EM и обычно освобождает их при совершении транзакции. У прокси-сервера у вас есть дескриптор, который затем будет повторно получать EntityManager под ним по мере необходимости или если начнется новая транзакция. Вы можете получить EntityManager непосредственно с фабрики, однако, чтобы избежать этой ситуации, которую контейнер может также ввести для вас. Это позволяет напрямую контролировать жизненный цикл.

В коде, который вы предоставили, хотя маловероятно, что anEntity == anEntity2 будет истинным, как если бы вам нужно было вызвать em.merge в anEntity, это не управляемый экземпляр. Вам нужно сохранить дескриптор управляемого объекта, чтобы он оставался постоянным для жизни EntityManager.

+0

Можно ли как-то преодолеть это? – krisy

+0

что anEntity! = AnEntity2? Да, используя управляемый экземпляр. Вы не показывали, как вы первоначально читали в anEntity, но если вы используете этот entityManager, это будет управляемый экземпляр и anEntity == anEntity2 без необходимости слияния. – Chris

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