Hibernate JPA и Spring javax.persistence.TransactionRequiredException: транзакция не выполняется - PullRequest
24 голосов
/ 26 ноября 2009

Когда я звоню:

entityManager.flush()

Я получаю исключение, указанное в заголовке.

Я использую Hibernate JPA.

Ответы [ 13 ]

17 голосов
/ 01 октября 2010

После того, как я сам столкнулся с этой проблемой и потратил несколько часов, пытаясь ее решить, я наконец нашел причину: Spring имеет ошибку и не может поддерживать транзакции с аннотацией @Transactional, если тот же класс имеет аннотацию @Service для средств автопроводки.

Как только аннотация @Service была удалена из рассматриваемого класса обслуживания, и в конфигурации XML был объявлен соответствующий bean-компонент:

<bean id="myService" class="com.example.myapp.service.MyServiceImpl" />

проблема исчезла.

Проверьте это Ошибка JIRA для получения более подробной информации.

5 голосов
/ 26 ноября 2009

Убедитесь, что у вас есть активная транзакция при выполнении этого оператора. Если вы используете JPA, используйте EntityManager.getTransaction (). Begin (). Это предполагает, что вы используете JPA вне области транзакции JTA.

Если вы запускаете приложение в контейнере с поддержкой JTA, вы также можете использовать JTA UserTransaction для управления транзакциями.

4 голосов
/ 10 декабря 2010

Моя проблема была связана с тем, как я настроил элемент <tx:annotation-driven/> в моем определении контекста -

Первоначально у меня было включено время загрузки (не известно), которое читало <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>, и, просто удалив 2-й атрибут - все работало (хотя и потребовалось 2 часа удара головой) Я полагаю, что 2-й элемент относится к стереотипу @Configurable, но может позволить другим (умнее) людям объяснить разницу и почему один будет работать, а другой нет ... Надеюсь, это поможет ...

рабочее определение = <tx:annotation-driven transaction-manager="transactionManager"/>

2 голосов
/ 12 мая 2017

У меня была та же проблема ... провел несколько часов, пока я наконец не нашел причину. Это была всего лишь одна строка кода, которая вызвала исключение в моем случае ...

В моем mvc-core-config.xml причиной была следующая строка:

<context:component-scan base-package="com.my.package.application" />

После того, как я изменил его следующим образом, все снова заработало:

<context:component-scan base-package="com.my.package.application.controller" />

Так что я предполагаю, что сканирование всех моих пакетов приложений, а не только моих классов @Controller, приводит к такой проблеме, как @harshal-waghmare, упомянутый в его посте к другому ответу .

2 голосов
/ 11 января 2016

У меня была эта проблема, просто добавьте аннотацию @Transacctional не только для метода, но и в классе вместе с аннотацией @Service.

например:

@Service
@Transactional
public class MyService {

}
2 голосов
/ 23 июля 2015

Убедитесь, что у вас есть активная транзакция при выполнении этого оператора. Если вы используете JPA, используйте EntityManager.getTransaction().begin(). Это предполагает, что вы используете JPA вне области транзакции JTA.

1 голос
/ 10 февраля 2017

Spring 4.3.1 / Hibernate 4.2.21

Моя конфигурация была на 100% Java-кодом без документов Hibernate или Spring XML (например, context.xml, persistence.xml и т. Д.). Проблема заключалась в том, что EntityManagerFactory я передавал на TransactionManager, см. Приведенную ниже конфигурацию в методе transactionManager.

@Configuration
@EnableTransactionManagement
public class HibernateConfiguration2 {

@Bean
public DataSource dataSource() {
    return ...; // Build a basic datasource
}

@Bean
@Autowired
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
    LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactory.setDataSource(dataSource);
    entityManagerFactory.setPackagesToScan("nz.co.mark");
    entityManagerFactory.setPersistenceProviderClass(org.hibernate.ejb.HibernatePersistence.class);

    return entityManagerFactory;
}

@Bean
@Autowired
public EntityManager entityManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
    EntityManager em = localContainerEntityManagerFactoryBean.getNativeEntityManagerFactory().createEntityManager();
    em.setFlushMode(FlushModeType.AUTO);
    return em;
}

@Bean
@Autowired
public JpaTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean emf) throws Exception {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf.getObject());
    // The below line would generate javax.persistence.TransactionRequiredException: no transaction is in progress
    // transactionManager.setEntityManagerFactory(emf.getNativeEntityManagerFactory());
    return transactionManager;
}
1 голос
/ 29 декабря 2009

Пожалуйста, убедитесь, что ваш метод обработчика объявлен как public

@Transactional 
@RequestMapping('/test')
public String doTest() {
    // do your stuff here 
    return 'testview';
}
0 голосов
/ 04 февраля 2014

Я наконец исправил эту ошибку, добавив

<tx:annotation-driven mode="aspectj" transaction-manager="yourTransactionManager" />

в мое application-context.xml

0 голосов
/ 29 июня 2011

Я сделал все это следующим образом. Мои проблемы были с тегом «import», есть несколько контекстных корней, таких как servlet-context и root-context, которые не зависят друг от друга. Это становится ясным с представлением Spring Explorer в STS. Нет JTA для Tomcat.

Мой совет будет универсальным: запустите Pet Clinic в вашей среде, Как запустить Spring 3.0 PetClinic в tomcat с JPA на основе Hibernate или сгенерируйте с помощью заглушки приложения Roo и попробуйте сравнить ваши конфиги с ссылками.

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