В настоящее время я перехожу на Spring Boot 3/Hibernate 6. Hibernate правильно анализирует все объекты и репозитории, подключается к базе данных и т. д.
Однако кажется, что @Transactional неправильно запускает транзакции.
Небольшой пример:
@Component
public class Test {
@Autowired
private EntityManagerFactory entityManager;
@Transactional
public void test() {
Session s = entityManager.unwrap(SessionFactory.class).getCurrentSession();
s.createQuery("FROM sometable").list();
}
}
Ошибка:
Caused by: org.hibernate.HibernateException: Calling method 'createQuery' is not valid without an active transaction (Current status: NOT_ACTIVE)
at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:341)
Соответствующая конфигурация:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.somepackage")
@EntityScan(basePackages = "com.somepackage")
public class TransactionConfig {
...
}
класс контекста сеанса в application.properties
...
spring.jpa.properties.hibernate.current_session_context_class=thread
...
Если я удалю вышеуказанную настройку session_content_class=thread, Я получаю эту ошибку:
Caused by: org.hibernate.HibernateException: No CurrentSessionContext configured
Редактировать 1:
Приведенное ниже по-прежнему приводит к той же ошибке «недействительно без активной транзакции».
@PersistenceUnit
private EntityManagerFactory entityManager;
Редактировать 2:
Если я не разворачиваю сеанс и просто вызываю класс с расширениями, расширяет JpaRepository, он работает... но создает новую транзакцию и игнорирует родительский @Transaction
Та же ошибка. Вызов метода createQuery недействителен без активной транзакции (текущий статус: NOT_ACTIVE)
Пробовали ли вы перейти на @PersistenceUnit и одновременно удалить конфигурацию current_session_context_class, чтобы проверить ее? Если это не сработает, вы можете попробовать использовать @PersistenceContext private EntityManager em
Удаление current_session_context и сохранение @PeristenceUnit вызывает No CurrentSessionContext configured
Исправление было следующим:
@PersistenceContext
private EntityManager entityManager;
и развернуть:
Session s = entityManager.unwrap(Session.class);
Попробуйте изменить
@Autowired private EntityManagerFactoryна@PersistenceUnit private EntityManagerFactory