26 Stimmen

Hibernate JPA und Spring javax.persistence.TransactionRequiredException: Es findet keine Transaktion statt

Wenn ich anrufe:

entityManager.flush()

Ich verstehe die im Titel erwähnte Ausnahme.

Ich bin mit Hibernate JPA.

17voto

Roman Punkte 1208

Nachdem ich selbst auf dieses Problem gestoßen bin und einige Stunden damit verbracht habe, es zu lösen, habe ich schließlich einen Grund dafür gefunden: Spring hat einen Fehler und kann keine Transaktionen mit @Transactional Annotation, wenn die gleiche Klasse @Service Vermerk für die Mittel der Selbstverdrahtung.

Sobald die @Service Annotation wurde aus der betreffenden Dienstklasse entfernt und eine entsprechende Bean in der XML-Konfiguration deklariert:

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

ist das Problem beseitigt.

Prüfen Sie dies JIRA-Fehler für weitere Einzelheiten.

5voto

Chandra Sekar Punkte 10483

Stellen Sie sicher, dass Sie eine aktive Transaktion haben, wenn diese Anweisung ausgeführt wird. Wenn Sie JPA verwenden, benutzen Sie EntityManager.getTransaction().begin(). Dabei wird davon ausgegangen, dass Sie JPA außerhalb eines JTA-Transaktionsbereichs verwenden.

Wenn Sie die Anwendung in einem Container mit JTA-Unterstützung ausführen, können Sie auch JTA UserTransaction zur Verwaltung von Transaktionen verwenden.

4voto

Mannie Punkte 1512

Mein Problem lag in der Art und Weise, wie ich die <tx:annotation-driven/> Element in meinem Kontext Definition -

Ursprünglich hatte ich Load Time Weaving aktiviert (nicht bekannt), das lautete <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> und indem ich einfach das 2. Attribut entfernte, funktionierte alles (was allerdings 2 Stunden Kopfzerbrechen kostete). Ich glaube, das 2. Element bezieht sich auf den @Configurable-Stereotyp, aber ich kann andere (klügere) Leute den Unterschied erklären lassen und warum das eine funktioniert und das andere nicht. Ich hoffe, das hilft...

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

3voto

Ich hatte dieses Problem, fügen Sie einfach @Transacctional Annotation nicht nur auf die Methode, auch in der Klasse zusammen mit Ihrem @Service Annotation.

zum Beispiel:

@Service
@Transactional
public class MyService {

}

3voto

markdsievers Punkte 6913

Spring 4.3.1 / Hibernate 4.2.21

Meine Konfiguration bestand zu 100 % aus Java-Code und enthielt keine Hibernate- oder Spring-XML-Dokumente (z. B. context.xml, persistence.xml usw.). Das Problem war die EntityManagerFactory Ich war auf dem Weg zum TransactionManager siehe die folgende Konfiguration in der transactionManager Methode.

@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;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X