Spring 3.2+;JPA(带Hibernate 3.6)和#x2B;Websphere 8(JTA)未刷新/提交某些操作
将后端从Hibernate更改为JPA(+Hibernate)后,我遇到了一些问题。我通过org.springframework.transaction.jta.WebSphereUowTransactionManager使用Websphere和容器事务管理。某些操作的行为不符合预期: 删除操作:如果我不手动刷新EntityManager,它将不会发出删除命令,实际上什么也不会发生Spring 3.2+;JPA(带Hibernate 3.6)和#x2B;Websphere 8(JTA)未刷新/提交某些操作,spring,hibernate,jpa,jta,websphere-8,Spring,Hibernate,Jpa,Jta,Websphere 8,将后端从Hibernate更改为JPA(+Hibernate)后,我遇到了一些问题。我通过org.springframework.transaction.jta.WebSphereUowTransactionManager使用Websphere和容器事务管理。某些操作的行为不符合预期: 删除操作:如果我不手动刷新EntityManager,它将不会发出删除命令,实际上什么也不会发生 @Transactional @Override public void deleteApplication(In
@Transactional
@Override
public void deleteApplication(Integer appId) {
Application app = appDAO.findOne(appId);
//em.flush(); to force the flush(), otherwise it doesn't do anything
appDAO.delete(app);
}
使用级联操作插入:应用程序实体与属性具有N:M关系。我尝试将某个属性添加到Application.attributes列表中的应用程序持久化。在appDAO.save()之后,我看到一个插入到应用程序语句中的语句。但是,级联属性永远不会插入到联接表中。同样,我需要手动刷新em()以发出de sql语句
@Transactional
@Override
public Application createApplication(Application application) {
appDAO.save(application);
//em.flush(); Needed to force the cascade into the join table
return application
}
我已尝试将transactionManager更改为非容器管理的(org.springframework.orm.jpa.JpaTransactionManager),它可以完美地工作,无需使用手动刷新
我没有使用persistence.xml文件,而是遵循Spring3.1中引入的方法(jtaDataSource+packagesToScan)。但是,我也尝试过使用persistence.xml文件的传统配置,我遇到了同样的错误行为
有什么建议吗
我的设置:
<bean id="mainEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="mainPersistenceUnit"/>
<property name="jtaDataSource" ref="mainDataSource"/>
<property name="packagesToScan" ref="packages-mainEntityManagerFactory"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</prop>
<prop key="hibernate.current_session_context_class">jta</prop>
<prop key="hibernate.transaction.flush_before_completion">true</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</prop>
</props>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
</bean>
<tx:annotation-driven order="0" />
<!-- Drives transactions using local JPA APIs -->
<bean name="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/>
org.hibernate.dialogue.mysql5dialogue
org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
jta
真的
真的
假的
假的
org.hibernate.transaction.cmttTransactionFactory
以防有人有同样的问题。解决办法归结为使用
<prop key="hibernate.transaction.factory_class">org.hibernate.ejb.transaction.JoinableCMTTransactionFactory</prop>
org.hibernate.ejb.transaction.JoinableCMTTransactionFactory
而不是
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</prop>
org.hibernate.transaction.CMTTransactionFactory