Cuando llamo:Hibernate JPA y primavera javax.persistence.TransactionRequiredException: no hay ninguna transacción en curso
entityManager.flush()
consigo la excepción mencionada en el título.
Estoy usando HFP JPA.
Cuando llamo:Hibernate JPA y primavera javax.persistence.TransactionRequiredException: no hay ninguna transacción en curso
entityManager.flush()
consigo la excepción mencionada en el título.
Estoy usando HFP JPA.
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.
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';
}
¡Buena captura bro ..! –
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.
Lo mismo me estaba pasando con el resorte 3.0.0/3.0.3. Los datos se mantuvieron en MySQL desde JUnit pero no desde el servidor de tomcat. Después de tanto trabajo, renuncié a RESOURCE_LOCAL para JTA.
Esto funcionó para mí http://erich.soomsam.net/2007/04/24/spring-jpa-and-jta-with-hibernate-and-jotm/ Utiliza JTA y depende de JOTM.
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.
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.
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. –
@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
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"/>
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.
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-
Tu respuesta contradice la respuesta de Ian. Eliminó el parámetro mode = "aspectj". – Brain
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.
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 {
}
La anotación @Transactional a la clase resolvió mi problema. – pablosaraiva
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;
}
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.
muestra su web.xml, y sus archivos de servlets –