Wenn ich anrufe:
entityManager.flush()
Ich verstehe die im Titel erwähnte Ausnahme.
Ich bin mit Hibernate JPA.
Wenn ich anrufe:
entityManager.flush()
Ich verstehe die im Titel erwähnte Ausnahme.
Ich bin mit Hibernate JPA.
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.
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.
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"/>
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 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.