【发布时间】:2014-03-05 09:40:14
【问题描述】:
将后端从 Hibernate 更改为 JPA (+Hibernate) 后,我遇到了一些问题。我正在通过 org.springframework.transaction.jta.WebSphereUowTransactionManager 使用 Websphere 和容器事务管理。某些操作的行为与预期不符:
删除操作:如果我不手动刷新 EntityManager,它不会发出删除,实际上什么都不会发生。
@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);
}
INSERT WITH CASCADE OPERATION: Application 实体与 Attribute 具有 N:M 关系。我尝试将一些属性添加到其 Application.attributes 列表中的应用程序持久化。在 appDAO.save() 之后,我看到一个插入到 Application 语句中。但是,级联属性永远不会插入到连接表中。同样,我需要手动 flush() 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
}
我尝试将事务管理器更改为非容器管理的事务管理器 (org.springframework.orm.jpa.JpaTransactionManager),它无需使用即可完美运行手动冲洗。
我没有使用 persistence.xml 文件,遵循 Spring 3.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"/>
【问题讨论】:
标签: spring hibernate jpa jta websphere-8