Java JPA / Hibernate: как избежать нескольких экземпляров объекта в сеансе? - PullRequest
4 голосов
/ 19 января 2011

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

Вот пример исследования: у родителя есть коллекция детей, сопоставленная с @ OneToMany

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

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

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

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

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

ура

Ответы [ 2 ]

2 голосов
/ 19 января 2011

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

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

entityManager.merge(a);
entityManager.refresh(b);
0 голосов
/ 19 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...