@Transactional не запускает транзакции с Spring Boot 3 / Hibernate 6

В настоящее время я перехожу на 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

Попробуйте изменить @Autowired private EntityManagerFactory на @PersistenceUnit private EntityManagerFactory

Panagiotis Bougioukos 08.02.2023 21:14

Та же ошибка. Вызов метода createQuery недействителен без активной транзакции (текущий статус: NOT_ACTIVE)

user1432882 08.02.2023 21:21

Пробовали ли вы перейти на @PersistenceUnit и одновременно удалить конфигурацию current_session_context_class, чтобы проверить ее? Если это не сработает, вы можете попробовать использовать @PersistenceContext private EntityManager em

Smaniotto 09.02.2023 03:05

Удаление current_session_context и сохранение @PeristenceUnit вызывает No CurrentSessionContext configured

user1432882 09.02.2023 03:13
0
4
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Исправление было следующим:

    @PersistenceContext 
    private EntityManager entityManager;

и развернуть:

    Session s = entityManager.unwrap(Session.class);

Другие вопросы по теме