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.