Обновить сущности в JPA - PullRequest
       2

Обновить сущности в JPA

4 голосов
/ 18 ноября 2011

Я не понимаю, как мне обновить состояние объекта, который уже находится в базе данных.Если быть более конкретным, предположим, что у меня есть «сущность» с таким кодом:

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(entity);
em.getTransaction().commit();
entityManager.close();

Поскольку я закрыл EntityManager, мой экземпляр сущности отсоединен.Теперь предположим, что у меня есть другие объекты, использующие этот экземпляр объекта.Если я хочу получить новое состояние этого объекта из базы данных, я почти не могу использовать em.refresh (), потому что объект отсоединен.Метод em.merge () возвращает управляемый экземпляр, и поскольку это не тот же экземпляр моего объекта, это может быть проблемой.Я могу предвидеть два решения:

  1. создать новый метод в моем объекте сущности, который обновляет свое состояние, используя данный экземпляр сущности.
  2. не закрывать диспетчер сущностей (последствия! ??)

Итак, что мне делать в этом случае?Как я могу обновить состояние моего объекта-сущности, не теряя при этом все ссылки из других объектов?Идеи?

Ответы [ 2 ]

1 голос
/ 28 марта 2018

Если сущность A ссылается на отсоединенную сущность B, объединение B возвращает B 'и обновление B'. Если вы объедините A, A изменит свою ссылку на B на B '.

A ---> B --(merge)--->B'
                    (refresh)
                    /
merge A -----------/
0 голосов
/ 23 ноября 2011

Чтобы избежать изменений, вносимых в сущность путем обновления и отключения после сохранения, можно реализовать интерфейс Cloneable и затем соответствующим образом обработать клонированную сущность.

//---

XEntity cloneX = (XEntity) entity.clone();

cloneX = entityManager.merge(cloneX);/* Persisting & getting synchronized copy */ 
// entityManager.refresh(cloneX); /* not need */

cloneX.copyTo(entity); // Add required changes back to entity if any

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