私は Web やthisやthisのようなページで多くの検索を行いましたが、これは主に 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.TransactionRequiredException
with メッセージが表示されます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 を外に出すことができます :)