2012-10-15 65 views
-1

我已经做了大量的搜索和网页,如thisthisthis大多建议使用CMTTransactionFactory。但是我仍然无法使它工作(我不知道这是因为我用的是LocalContainerEntityManagerFactoryBean创建EM而不是创建由LocalSessionFactoryBean的Hibernate会话)自动刷新不适用于Spring 3.1 LocalEntityManagerFactoryBean +休眠4 + Websphere JTA

我的应用服务看起来像:

@Transactional(propagation=Propagation.REQUIRES_NEW) 
public class FooServiceImpl implements FooService { 
    @Inject 
    private FooRepository fooRepo; 

    public void doSomething() { 
    Foo foo = fooRepo.findBySomething(...); 
    foo.setBar(...); 
    //fooRepo.flush();  // un-comment to do manual-flushing 
    } 
} 

这里是我的应用程序CTX

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/fooDs" /> 

<bean id="transactionManager" 
    class="org.springframework.transaction.jta.WebSphereUowTransactionManager" /> 

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" /> 
     </bean> 
    </property> 
    <property name="persistenceUnitName" value="foo" /> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan" value="com.foo" /> 
    <!-- 
     <property name="persistenceXmlLocation" value="classpath:/META-INF/test-persistence.xml" /> 
    --> 
    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
       <entry key="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup" /> 
       <entry key="hibernate.transaction.factory_class" value="org.hibernate.transaction.CMTTransactionFactory"/> 

      <entry key="hibernate.transaction.flush_before_completion" value = "true" /> 
     </map> 
    </property> 
</bean> 

我正在使用Spring数据JPA和实体检索后,我更新的内容片断。如果我没有手动刷新存储库(这意味着session/entityManager),它只是放弃我的更改。

任何人都可以给我提示一些我在设置中错过的提示吗?使用LocalContainerEntityManagerFactoryBean有什么特别的注意事项吗?

我试图将manager_lookup_class的jpaProperty条目更改为 hibernate.transaction.jta.platform => org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform但它没有帮助。

我也试过用org.hibernate.transaction.JTATransactionFactory作为transaction factory class,甚至删除了transaction factory class。这种改变似乎使得Hibernate无法取得交易。当我手动刷新库,它只是给我一份有消息javax.persistence.TransactionRequiredExceptionno transaction is in progress

我使用Spring 3.1.2.RELEASE,JPA与Hibernate 4.1.6.Final下,WebSphere 8

是否有任何使用上面的组合,并有我可以遵循的工作配置?


编辑:我试图注入EntityManager到服务,以避免使用Spring Data JPA。症状是一样的:我必须显式调用entityManager.flush()来让Hibernate获取更新的实体。至少我们可以拿出图片中的Spring Data :)

回答

0

我在其他论坛上提出过讨论。这里是包含背后原因的链接。

http://forum.springsource.org/showthread.php?131051-Auto-Flush-not-working-for-Spring-3-1-LocalEntityManagerFactoryBean-Hibernate-4-JTA

它是由,上述组合是要设置与交易类型为RESOURCE_LOCAL实体管理器引起的。这不适用于上述库的版本组合(虽然它在使用Spring 2.5 + Hibernate 3时起作用)。

解决此问题的方法是声明事务类型为JTA(通过提供persistence.xml)。

更好的解决方案是在春末的版本,这LocalEntityManagerFactoryBean负责提供jtaDataSource属性(https://jira.springsource.org/browse/SPR-9883)

0

你的问题是这样的条目中提供。

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

删除该操作并且在事务完成后自动刷新工作。似乎与该条目添加你必须手动调用实体管理器刷新。