0

私は Web やthisthisのようなページで多くの検索を行いましたが、これは主に CMTTransactionFactory の使用を提案しています。ただし、まだ機能させることができません (LocalSessionFactoryBean で Hibernate セッションを作成する代わりに、LocalContainerEntityManagerFactoryBean を使用して EM を作成しているためでしょうか)。

私の App Service は次のようになります。

@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 Data 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.TransactionRequiredExceptionwith メッセージが表示されますno transaction is in progress

Spring 3.1.2.RELEASE、JPA with Hibernate 4.1.6.Final、Websphere 8 を使用しています。

上記の組み合わせを使用していて、私がフォローできる機能する構成を持っている人はいますか?


編集: Spring Data JPA の使用を避けるために、サービスに EntityManager を注入しようとしました。症状は同じです。Hibernate が更新されたエンティティを取得できるようにするには、entityManager.flush() を明示的に呼び出す必要があります。少なくとも、Spring Data を外に出すことができます :)

4

2 に答える 2

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) を提供する Spring の新しいバージョンでは、より良い解決策が提供されています。

于 2012-12-05T07:29:03.297 に答える