JPA: всегда ли EntityManager.find () возвращает одну и ту же ссылку на объект для одного и того же ключа? - PullRequest
3 голосов
/ 19 ноября 2010

У меня есть интеграционный тест DAO, в котором я использую общий EntityManager (через Spring, используя SharedEntityManagerCreator).Класс теста помечен как @Transactional, как и тестируемый метод DAO.

Как в классе теста, так и в DAO я получаю сущность User следующим образом:

User user = em.find(User.class, "test");

В настройке моего теста я изменил объект пользователя, но я не былне вижу изменений в DAO, когда тест запускается.Оказалось, что две ссылки не относятся к одному и тому же объекту;Я доказал это в своем тестовом классе, используя:

System.out.println("User objects equal = " + (user == dao.getUser()));

Это распечатано как ложное.Я ожидаю, что каждый вызов EntityManager, использующий один и тот же ключ, будет возвращать одну и ту же ссылку на объект, и был удивлен (и немного встревожен!), Обнаружив, что это не тот случай.Кто-нибудь может пролить свет на это?Я реорганизовал свой код, так что на самом деле это не проблема (в DAO все равно не должно быть объекта User), но я все же хотел бы лучше понять это.

Спасибо!

Java 1.6u22, Toplink Essentials 2.0.1, Spring 2.5.6

Ответы [ 2 ]

6 голосов
/ 19 ноября 2010

find() возвращает тот же экземпляр в контексте постоянства .

В случае общего EntityManager (контекст персистентности в области транзакций, управляемой контейнером, в терминах спецификации JPA) жизненный цикл контекста персистентности привязан к транзакции, поэтому find() возвращает тот же экземпляр при вызове изта же транзакция. Полагаю, в вашем случае настройка вашего теста не происходит в той же транзакции, что и метод теста, поэтому find() создает разные экземпляры.

0 голосов
/ 19 ноября 2010

Нет, это не так.В любом случае вы должны полагаться на объект EQUALITY вместо IDENTITY.Переопределить метод equals.

...