Hibernate: обновить один и тот же объект в другой сессии - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь это сделать, но не работает, кто-нибудь может подсказать мне, что я не прав?В итоге я теряю первое обновление

    EntityManager entityManager1 = JPAUtil.getEntityManagerFactory().createEntityManager();
    EntityManager entityManager2 = JPAUtil.getEntityManagerFactory().createEntityManager();

    Session session1 = (Session) entityManager1.getDelegate();
    Prova prova1 = session1.load(Prova.class, "020");

    Session session2 = (Session) entityManager2.getDelegate();
    Prova prova2 = session2.load(Prova.class, "020");

    prova2.setDes(prova2.getDes() + " 2");    
    prova1.setShortdes(prova1.getShortdes() + " 1");

    Transaction t2 = session2.beginTransaction();
    session2.update(prova2);
    t2.commit();
    session2.close();

    Transaction t1 = session1.beginTransaction();
    session1.update(prova1);
    t1.commit();
    session1.close();

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Как и в предыдущем ответе, вам всегда нужно проверять версию объекта перед сохранением.Hibernate или JPA имеют функции, называемые оптимистическая блокировка , чтобы решить эту проблему.Обратитесь к приведенному ниже коду и ссылке для получения дополнительной информации.

@Entity
public class Employee 
{
  @Id
  @GeneratedValue
  private Integer id;
  @Version
  private long version;
  private String name;
}

При создании записи сотрудника инфраструктура автоматически создает значение версии.Сначала предположим, что значения

[1, 0, "name1"]

При обновлении оно меняется на

[1, 1, "name2"]

При следующем обновлении оно меняется на

[1, 2, "name3"]

фреймворк выдаст исключение, если вы попытаетесь обновить данные с неправильной версией

Ссылка содержит больше информации об этом https://www.logicbig.com/tutorials/java-ee-tutorial/jpa/optimistic-lock.html

0 голосов
/ 17 февраля 2019

Добавьте следующий код для исправления:

    t2.commit();
    session2.close();
    session1.refresh(prova1)
    prova1.setShortdes(prova1.getShortdes() + " 1");

Transaction t1 = session1.beginTransaction();
    session1.update(prova1);
    t1.commit();

Здесь происходит следующее:

Сначала вы выполняете обновление на prova2, в результате чего des обновляется.

Затем обновляется значение prova1 shortdes, но его отключенное состояние des является исходным состоянием prova до обновления prova2.Алгоритм обновления таков, что он пытается повторно подключить prova1 к постоянному контексту и понимает, что он отличается от постоянного состояния в двух полях, поэтому первое обновление пропускается, и в итоге вы устанавливаете shortDes, но Des возвращается в исходное состояние.

Подробнее здесь https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate

...