Quando chiamo:Hibernate JPA e Spring javax.persistence.TransactionRequiredException: nessuna transazione è in corso
entityManager.flush()
ottengo l'eccezione menzionata nel titolo.
Sto utilizzando Hibernate JPA.
Quando chiamo:Hibernate JPA e Spring javax.persistence.TransactionRequiredException: nessuna transazione è in corso
entityManager.flush()
ottengo l'eccezione menzionata nel titolo.
Sto utilizzando Hibernate JPA.
Assicurarsi di disporre di una transazione attiva quando viene eseguita questa istruzione. Se si utilizza JPA, utilizzare EntityManager.getTransaction(). Begin(). Questo presuppone che tu stia utilizzando JPA al di fuori di un ambito di transazione JTA.
Se si sta eseguendo l'applicazione in un contenitore con supporto JTA, è possibile utilizzare anche JTA UserTransaction per gestire le transazioni.
Si prega di assicurarsi che il vostro metodo del gestore è dichiarato come public
@Transactional
@RequestMapping('/test')
public String doTest() {
// do your stuff here
return 'testview';
}
buona cattura bro ..! –
Assicurarsi che la configurazione di primavera include la seguente riga:
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />
mode
può essere sia procura o aspectj e transaction-manager
devono indicare la transazione manager stato.
Lo stesso mi è successo usando la 3.0.0/3.0.3. I dati sono stati mantenuti in MySQL da JUnit ma non dal server tomcat. Dopo tanto lavoro ho rinunciato a RESOURCE_LOCAL per JTA.
Questo ha funzionato per me http://erich.soomsam.net/2007/04/24/spring-jpa-and-jta-with-hibernate-and-jotm/ Utilizza JTA e dipende da JOTM.
Per JBoss 4.0 e Hibernate, ho risolto questo problema con l'aggiunta di alcune proprietà delle transazioni Manager ai miei EntityManagerFactoryBean
definizione:
<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>
ho trovato il soluton on this message board thread.
Dopo aver incontrato personalmente questo problema e aver trascorso alcune ore a risolverlo, ho finalmente trovato una ragione: Spring ha un bug e non può mantenere le transazioni con l'annotazione @Transactional
se la stessa classe ha l'annotazione @Service
per i mezzi di autowiring.
Una volta che l'annotazione @Service
è stato rimosso dalla classe di servizio in questione, e un bean appropriata è stata dichiarata nella configurazione XML:
<bean id="myService" class="com.example.myapp.service.MyServiceImpl" />
il problema è scomparso.
Controllare questo JIRA bug per ulteriori dettagli.
Ben dicendo che questo è un bug non completamente corretto, il link che hai già fornito ha dato una buona spiegazione del perché questo sta accadendo: la classe Service viene istanziata come bean sia in appContext.xml che in spring-servlet.xml. Dovrebbe solo essere 'bean' in appContext.xml altrimenti non avrà supporto per le transazioni. –
@HarshalWaghmare Hai salvato il mio fondo due volte. Ho incontrato lo stesso errore due volte e cercavo avidamente di trovare nuovamente il tuo commento: D. Finalmente, evviva. Ha detto servlet-context solo per scansionare i controller ... tutto funziona come un incantesimo. – Aubergine
Il mio problema era a che fare con il modo in cui ha installato il <tx:annotation-driven/>
elemento nella mia definizione del contesto -
Inizialmente ho avuto il tempo di caricamento di tessitura abilitato (non knownley) che leggere <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
e semplicemente rimuovendo il secondo attributo - tutto ha funzionato (ha richiesto 2 ore di sbattere la testa comunque). Credo che il secondo elemento si riferisce alla sterotype @Configurable ma può lasciare che gli altri (intelligenti) persone spiegano la differenza & perché uno dovrebbe lavorare definizione & l'altro fa non .. Spero che questo aiuti ...
lavoro = <tx:annotation-driven transaction-manager="transactionManager"/>
Ho fatto tutto ciò che segue. I miei problemi erano con il tag "import", ci sono diverse root di contesto come servlet-context e root-context che non dipendono l'uno dall'altro. Diventa chiaro con la visualizzazione Spring Explorer in STS. Nessun JTA per Tomcat.
Il mio consiglio sarebbe universale: esegui Pet Clinic sul tuo ambiente, How to run Spring 3.0 PetClinic in tomcat with Hibernate backed JPA o genera con Roo stub di applicazione e prova a confrontare le tue configurazioni con riferimenti.
ho finalmente risolto questo errore con l'aggiunta di
<tx:annotation-driven mode="aspectj" transaction-manager="yourTransactionManager" />
nella mia applicazione-context.xml
La tua risposta contraddice la risposta di Ian. Ha rimosso il parametro mode = "aspectj". – Brain
Verificare di disporre di una transazione attiva quando questa istruzione viene eseguita. Se si utilizza JPA, utilizzare EntityManager.getTransaction().begin()
. Questo presuppone che tu stia utilizzando JPA al di fuori di un ambito di transazione JTA.
Ho riscontrato questo problema, è sufficiente aggiungere l'annotazione @Transacctional non solo sul metodo, anche nella classe insieme all'annotazione @Service.
ad esempio:
@Service
@Transactional
public class MyService {
}
L'annotazione @Transactional alla classe ha risolto il mio problema. – pablosaraiva
Primavera 4.3.1/Hibernate 4.2.21
La mia configurazione è stata del 100% di codice Java senza sospensione o primaverili documenti XML (ad esempio context.xml, persistence.xml eccetera). Il problema era il EntityManagerFactory
che stavo passando allo TransactionManager
, vedere la configurazione seguente nel metodo 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;
}
Ho avuto lo stesso problema ... ho trascorso alcune ore finché non ho trovato il motivo alla fine. era solo una riga di codice che ha causato l'eccezione nel mio caso ...
Nel mio MVC-core-config.xml la seguente riga è stato il motivo:
<context:component-scan base-package="com.my.package.application" />
Dopo ho cambiato come segue, tutto ha funzionato ancora una volta:
<context:component-scan base-package="com.my.package.application.controller" />
quindi credo che la scansione di tutti i miei pacchetti di applicazioni invece di solo le mie classi @Controller portare alla problema come @ harshal-waghmare menzionato in his post to another answer.
mostra il tuo web.xml, e i tuoi file servlet –