true transaction transacciones requires_new example ejemplo spring hibernate jpa jpa-2.0

transaction - transacciones en spring boot



No se permite crear transacciones en EntityManager compartido; use transacciones Spring o EJB CMT (2)

La inyección de EntityManagerFactory en lugar de EntityManager y javax.transaction. La anotación transaccional en el método resolvió mi problema como se muestra a continuación.

//Autowire EntityManagerFactory @PersistenceUnit(unitName = "readwrite.config") private EntityManagerFactory entityManagerFactory; //Use below code on create/update EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); if (!ObjectUtils.isEmpty(entity) && !entityManager.contains(entity)) { entityManager.persist(entity); entityManager.flush(); } entityManager.getTransaction().commit();

Esta publicación está en continuación de JPA Cómo obtener el valor de la base de datos después de persistir

Cuando ejecuto lo siguiente, obtengo la siguiente excepción, ¿cómo puedo resolver esto?

Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT

Código DAOImpl

public void create(Project project) { entityManager.persist(project); entityManager.getTransaction().commit(); project = entityManager.find(Project.class, project.getProjectId()); entityManager.refresh(project); System.out.println("Id -- " + project.getProjectId()); System.out.println("no -- " + project.getProjectNo()); }

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean id="DataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="username" value="scott" /> <property name="password" value="tiger" /> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@myserver:1521:ORCL" /> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="DataSource" /> <property name="packagesToScan" value="test.entity" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="true" /> <property name="generateDdl" value="false" /> <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" /> </bean> </property> </bean> <context:component-scan base-package="test.net" /> <tx:annotation-driven transaction-manager="transactionManager"/> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <context:annotation-config/> </beans>


Supongo que el problema aquí es que aunque ha definido el bean para el administrador de transacciones, no ha anotado el método create () con @Transactional que habilita las transacciones de primavera.

También elimine el entityManager.getTransaction().commit(); declaración ya que ahora toda la gestión de transacciones se manejará en primavera, si deja la declaración como está, entonces obtendrá nuevamente el mismo error.