2009-11-26 16 views

Respuesta

4

Asegúrese de tener una transacción activa cuando se ejecuta esta instrucción. Si está utilizando JPA use EntityManager.getTransaction(). Begin(). Esto supone que está utilizando JPA fuera de un alcance de transacción JTA.

Si está ejecutando la aplicación dentro de un contenedor con compatibilidad con JTA también puede usar JTA UserTransaction para administrar las transacciones.

1

Por favor asegúrese de que su método de control se declara como public

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

¡Buena captura bro ..! –

0

Asegúrese de que la configuración de la primavera incluye la siguiente línea:

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

mode puede ser de proxy o aspectj y transaction-manager tiene que apuntar a su transacción gerente estado.

0

para JBoss 4.0 y Hibernate, que fija este problema mediante la adición de algunas propiedades del gestor de transacciones para mi definición 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> 

he encontrado el Soluton on this message board thread.

14

Después de encontrarse con este problema a mí mismo y pasar unas horas tratando de que lo resuelva por fin encontré una razón para ello: El resorte tiene un error y no puede mantener transacciones con @Transactional anotación de si la misma clase tiene @Service anotación para los medios de autoenvío.

Una vez que el @Service anotación fue retirado de la clase de servicio de que se trate, y un bean apropiado fue declarado en la configuración XML:

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

el problema se ha ido.

Compruebe esto JIRA bug para más detalles.

+4

Bien diciendo que esto es un error no es totalmente correcto, el enlace que ya ha dado ya ha dado una buena explicación de por qué está sucediendo esto: la clase de servicio se crea una instancia como un bean en appContext.xml y spring-servlet.xml. Solo debe ser 'bean'ed en appContext.xml, de lo contrario no tendrá soporte para transacciones. –

+0

@HarshalWaghmare Has guardado mi fondo dos veces. Me encontré con el mismo error dos veces y estaba ansiosamente tratando de encontrar tu comentario de nuevo: D. Finalmente, hurra. Dijo servlet-context solo para escanear controladores ... todo funciona como el encanto. – Aubergine

3

mi problema era que ver con la forma en que la instalación que el <tx:annotation-driven/> elemento en mi contexto definición -

Originalmente tenía tiempo de carga activar el tejido (no knownley) que decía <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> y por la simple eliminación del segundo atributo - todo lo funcionó (tomó 2 horas de golpear la cabeza sin embargo). Creo que el segundo elemento se relaciona con el estereotipo @Configurable pero puede dejar que otras personas (inteligentes) explican la diferencia & por qué se podría trabajar definición & hace el otro no .. Espero que esto ayude ...

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

0

Hice todo esto como un seguidor. Mis problemas eran con la etiqueta "importar", hay varias raíces de contexto como servlet-context y root-context que no son dependientes entre sí. Se vuelve claro con la vista de Spring Explorer en STS. No hay JTA para Tomcat.

Mi consejo sería universal: ejecute Pet Clinic en su entorno, How to run Spring 3.0 PetClinic in tomcat with Hibernate backed JPA o genere con Roo stub de aplicación e intente comparar sus configuraciones con las referenciadas.

0

que finalmente han fijado este error mediante la adición de

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

en mi aplicación context.xml-

+0

Tu respuesta contradice la respuesta de Ian. Eliminó el parámetro mode = "aspectj". – Brain

2

Asegúrese de que tiene una transacción activa cuando esta instrucción se ejecuta. Si usa JPA, use EntityManager.getTransaction().begin(). Esto supone que está utilizando JPA fuera de un alcance de transacción JTA.

2

Tuve este problema, simplemente agregue la anotación @Transacctional no solo en el método, también en la clase junto con su anotación @Service.

por ejemplo:

@Service 
@Transactional 
public class MyService { 

} 
+0

La anotación @Transactional a la clase resolvió mi problema. – pablosaraiva

1

primavera 4.3.1/Hibernate 4.2.21

Mi configuración fue 100% código Java sin hibernación o resorte documentos XML (por ejemplo context.xml, persistence.xml etc.) El problema fue el EntityManagerFactory que estaba pasando al TransactionManager, consulte la configuración siguiente en el método 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

Tuve el mismo problema ... pasé algunas horas hasta que finalmente encontré el motivo. que era sólo una línea de código que causó la excepción en mi caso ...

En mi mvc-core-config.xml la siguiente línea fue la razón:

<context:component-scan base-package="com.my.package.application" /> 

Después he cambiado de la siguiente manera, todo funcionó de nuevo:

<context:component-scan base-package="com.my.package.application.controller" /> 

así que supongo que el escaneo de todos mis paquetes de aplicaciones en lugar de sólo mis clases @Controller conducir a la problema como @ harshal-waghmare mencionado en his post to another answer.

Cuestiones relacionadas