我在应用程序上下文中有以下配置
<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
}
}
现在,当我保存实体时,它不会说给出任何错误,但没有数据更新到数据库中。我不希望使用flush,因为entitymanager是由spring注入的,应该在最后自动执行flush,但这并没有发生。纠正我的理解。
添加facade类可能是个问题,Propagation.REQUIRES_NEW和这里有什么关系吗?
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void process(){
Employee e = factory.getEmployee();
employeeDao.create(e);
}
在创建方法调用后的调试中,它显示员工已填充主键,这意味着数据库调用已经进行,但最后它没有持久化。
请尝试3:
1.解决方案1
请拨打以下代码
em.joinTransaction();
就在之前
em.persistEntity(entity);
2.解决方案2
在@Transactional 中使属性readOnly=false
3.解决方案3
尝试在spring xml文件中手动添加bean EmployeeDAO
或者你可以试试下面的:
@Transactional(propagation=Propagation.REQUIRED)