【问题标题】:Spring 3.2 + JPA (with Hibernate 3.6) + Websphere 8 (JTA) not flushing/commiting some operationsSpring 3.2 + JPA (with Hibernate 3.6) + Websphere 8 (JTA) not flushing/commiting some operations
【发布时间】: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


    【解决方案1】:

    如果有人遇到同样的问题。解决方案归结为使用

    <prop key="hibernate.transaction.factory_class">org.hibernate.ejb.transaction.JoinableCMTTransactionFactory</prop>
    

    而不是

    <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</prop>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 2015-01-01
      • 2016-07-07
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      相关资源
      最近更新 更多