【发布时间】:2016-09-04 22:37:17
【问题描述】:
我在应用程序上下文中有以下配置
<jee:jndi-lookup id="dataSource" jndi-name="MY_DS" />
<context:load-time-weaver/>
<bean id="transactionManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="emf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jtaDataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
<property name="persistenceUnitName" value="pu_TEST" />
</bean>
<bean id="jpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<property name="database" value="ORACLE" />
<property name="showSql" value="true" />
</bean>
现在是我的 DAO 课程
@Repository
public class EmployeeDAO{
@PersistenceContext
private EntityManager em;
@Transactional
public void create(Employee entity) {
LOG.error("Enitity Manager:create" + em);
em.persist(entity);
// em.flush(); if i use flush it saves
}
}
现在,当我保存实体时,它没有说给出任何错误,但没有数据更新到数据库中。 我不希望使用刷新,因为实体管理器是由弹簧注入的,并且应该在最后自动执行刷新,这不会发生。纠正我的理解。
添加外观类可能存在问题,Propagation.REQUIRES_NEW 有什么关系吗?
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void process(){
Employee e = factory.getEmployee();
employeeDao.create(e);
}
在创建方法调用后的调试中,它显示员工获得了填充的主键,这意味着已经进行了数据库调用,但最后它没有被持久化。
【问题讨论】:
-
您使用的是哪个 Spring 版本?
-
我使用的是 Spring 3.2
-
EntityManager 没有连接到您的事务管理器,因此没有注册为事务提交时的侦听器。正如下面的答案中提到的, em.joinTransaction() 会起作用,但它是一种解决方法,就像调用 em.flush 一样。您缺少传递给 TransactionManager 的 entityManagerFactory 属性,如此处所述stackoverflow.com/questions/10421829/… 或尝试设置目标服务器属性eclipse.org/eclipselink/documentation/2.4/jpa/extensions/…
-
我正在使用“org.springframework.transaction.jta.WebLogicJtaTransactionManager”它不允许 EMF 的属性。
-
bean 类 [org.springframework.transaction.jta.WebLogicJtaTransactionManager] 的无效属性 'entityManagerFactory':Bean 属性 'entityManagerFactory' 不可写或具有无效的 setter 方法。 setter的参数类型和getter的返回类型是否匹配?
标签: spring jpa eclipselink jta