2009-11-26 15 views

risposta

4

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.

1

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'; 
} 
+0

buona cattura bro ..! –

0

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.

0

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.

14

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.

+4

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. –

+0

@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

3

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"/>

0

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.

0

ho finalmente risolto questo errore con l'aggiunta di

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

nella mia applicazione-context.xml

+0

La tua risposta contraddice la risposta di Ian. Ha rimosso il parametro mode = "aspectj". – Brain

2

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.

2

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 { 

} 
+0

L'annotazione @Transactional alla classe ha risolto il mio problema. – pablosaraiva

1

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

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.

Problemi correlati