2011-01-19 4 views
3

Я понимаю, что JPA не работает так, как я ожидал, так как часто я получаю несколько экземпляров одного объекта в сеансе.Java JPA/Hibernate: Как избежать множественных экземпляров объекта в сеансе?

Вот исследование случай: родитель имеет коллекцию ребенка переведенный с @OneToMany

В одном методе:

  • получить экземпляр Материнской P объекта
  • нагрузки коллекция ребенка с P.getChilds(): он содержит экземпляр C1 и C2
  • затем найдите конкретного ребенка с оптимизированным запросом JPA, имеющим родительский P, имеет параметр: Child C = dao.getSpecificChild (P)

Здесь я ожидал бы, что C будет одним из двух уже загруженных экземпляров (из C1 или C2). Я думал, что JPA проверит уже существующий экземпляр в текущем сеансе. Но JPA загрузит новый экземпляр C (независимо от того, имеет ли он C1 или C2).

Так что я в конечном итоге с двумя различными экземплярами C.

Мой вопрос: является ли это ожидаемое поведение? Если это так, как я могу примирить экземпляры сущности в сеансе?

веселит

+0

Экземпляр родительского P & dao.getSpecificChild (P) извлекается с использованием того же или другого entitymanager –

ответ

2

как я могу согласовать свои экземпляры сущностей в сеансе ?

Если вы хотите передать состояние от объекта а в сущности б, вы можете сделать следующее:

entityManager.merge(a); 
entityManager.refresh(b); 
+0

Кажется, что это хороший вариант для исправления чего-то, что выглядит как недостающее поведение для меня! ура – nodje

0

я тоже ожидал бы экземпляр C вернулся из запроса, чтобы быть одним из ранее возвратил Cs (предполагая, что он тот же txn), поскольку они уже зачислены в транзакцию, и это то, что, безусловно, делает DataNucleus (поскольку он также реализует JDO, и это часть спецификации), и для этого нужен кеш L1.

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