Подтвердить что ты не робот

Hibernate JPA и Spring javax.persistence.TransactionRequiredException: транзакция не выполняется

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

entityManager.flush()

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

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

4b9b3361

Ответ 1

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

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

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

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

Подробнее об этом JIRA.

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

например:

@Service
@Transactional
public class MyService {

}

Ответ 6

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

@Transactional 
@RequestMapping('/test')
public String doTest() {
    // do your stuff here 
    return 'testview';
}

Ответ 7

Spring 4.3.1/Спящий режим 4.2.21

Моя конфигурация была 100% Java-кодом без документов спящего режима или 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;
}

Ответ 8

Убедитесь, что ваша конфигурация spring включает следующую строку:

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

mode может быть либо прокси, либо аспект j, а transaction-manager должен указывать на ваш менеджер транзакций.

Ответ 9

То же самое происходило со мной, используя spring 3.0.0/3.0.3. Данные сохранялись в MySQL из JUnit, но не с сервера tomcat. После такой работы я отказался от RESOURCE_LOCAL для JTA.

Это сработало для меня http://erich.soomsam.net/2007/04/24/spring-jpa-and-jta-with-hibernate-and-jotm/ Он использует JTA и зависит от JOTM.

Ответ 10

Для JBoss 4.0 и Hibernate я исправил эту проблему, добавив некоторые свойства менеджера транзакций в определение EntityManagerFactoryBean:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="xaDs" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory
            </prop>
            <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup
            </prop>
        </props>
    </property>

Я нашел soluton в этой ветке сообщения.

Ответ 11

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

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

Ответ 12

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

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

в мой application-context.xml

Ответ 13

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

В моем 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, упомянутой в его сообщении другому ответу.