Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 3.2+;JPA(带Hibernate 3.6)和#x2B;Websphere 8(JTA)未刷新/提交某些操作_Spring_Hibernate_Jpa_Jta_Websphere 8 - Fatal编程技术网

Spring 3.2+;JPA(带Hibernate 3.6)和#x2B;Websphere 8(JTA)未刷新/提交某些操作

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

将后端从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);

}
使用级联操作插入:应用程序实体与属性具有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