Я использую Spring Bot 2.1.8. Release с Hibernate5.Моя проблема в том, что метод обновления сессии Hibernate не работает для меня.Я получаю запись из базы данных, используя метод get сессии hibernate и присваиваю ее некоторой переменной своего типа.затем у меня пауза в 30 секунд. Тем временем я изменяю эту запись с уровня базы данных, и после этой паузы я вызываю метод обновления сеанса гибернации.Но этот сеанс не извлекает измененную запись, вместо этого он возвращает предыдущую запись, полученную мной с использованием метода get сеанса гибернации.
Ниже приведен мой рабочий код:
package com.example.service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.hibernate.Session;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.CompositeKey.Employee;
import com.example.CompositeKey.EmployeeIdentity;
@Service
public class CompositeKeyTester {
@PersistenceContext
private EntityManager entityManager;
private Session getHibernateSession() {
Session session = entityManager.unwrap(Session.class);
return session;
}
@Transactional
public void saveObjects() {
Session session = getHibernateSession();
Employee employee = session.get(Employee.class, 1);
System.out.println(employee); // return name="Rajan"
Thread.sleep(30000); // meanwhile i'm changing employee record in database, lets say name = "something"
session.refresh(employee); // I can see the database select quert executed via hinerbate logs.
System.out.println(employee); // but still getting "Rajan", It should be "something"
}
}
IРешил эту проблему, используя два разных сеанса гибернации, и перед вызовом метода refresh я объединяю объект, возвращенный методом get, во второй сеанс.Ниже мой код:
Session session1 = getHibernateSession();
Session session2 = getHibernateSession();
Employee employee = session1.get(Employee.class, 1);
System.out.println(employee); // return name="Rajan"
Thread.sleep(30000); // meanwhile i'm changing employee record in
database, lets say name = "something"
Employee merged = (Employee) session2.merge(employee);
session2.refresh(merged);
System.out.println(merged); // return name="something"
Но я хочу сказать, как я могу добиться этого с помощью одного сеанса гибернации?