1

JTA Transaction Managerを使用しているときに、Hibernate4に移行するのに問題があります。
たぶんあなたは助けることができます、なぜなら私はすべてアイデアがないからです。

ソフトウェア:

Spring:3.1.1.RELEASE
Hibernate: 4.1.3。最終
データベース:Oracle 11g
アプリケーション:Websphere Application Server7.0にデプロイされたEjb3.0 (Springコンテキストの初期化に使用)@Interceptors(SpringBeanAutowiringInterceptor.class)

スプリング構成:

<context:annotation-config />
<context:component-scan base-package="myServicePackage,myDaoPackage" />

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/MyDataSource" />

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="myModelPackage" />
    <property name="mappingResources" value="queries.xml" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
        </props>
    </property>
</bean>

<tx:jta-transaction-manager />
<!-- <bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager" /> -->
<tx:annotation-driven />

サービス:

@Service
public class TradeService {
    @Autowired
    private TradeDao tradeDao;
}

Dao:

@Repository
@Transactional
public class TradeDao {
    @Autowired
    private SessionFactory sessionFactory;

    public Trade getTrade(){
        return (Trade) sessionFactory.getCurrentSession().getNamedQuery("get_trade").uniqueResult();
    }

スロー:

org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1041)
at myDaoPackage.TradeDao.getTrade(TradeDao.java:26)

ノート:

  1. @Transactionaldaoの代わりにサービスで使ってみました。同じ結果。
  2. 同様の構成ですが、Spring 3.0.5.RELEASEHibernate 3.6.5.Final、およびTradeDao拡張HibernateDaoSupport機能を使用しています。

それで、誰かが何かアイデアを持っていますか?
今日は一日中たくさんのことをやっています。
頭が回転していてイライラしているので、とてもシンプルなものが欠けているに違いありませんが、現時点ではわかりません:)

4

3 に答える 3

1

私はついにこれを機能させました。

私が期待していたように、私はいくつかの小さな構成が欠けていました:)

<property name="hibernateProperties">
    <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
        <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</prop>
        <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</prop>
    </props>
</property>

これらの構成オプションは、ブラウジング中に以前に見つけましたが、何らかの理由で試したときに機能しませんでした。おそらく、その時点で何か別の問題がありました...(トランザクション戦略の構成の章を参照)

助けてくれてありがとう!

于 2012-06-01T17:30:20.110 に答える
0

これはおそらく、この人が抱えていた問題によく似ています:http: //forum.springsource.org/showthread.php?121109-Transaction-Propagations-and-Hibernate-4

つまり、HibernateDaoSupport(およびおそらくHibernateTemplate)は、スレッドでセッションが見つからなかった場合にセッションを作成していましたが、新しいアプローチでは見つからなかったようです。

編集:含まれているリンクがHibernateTransactionManagerを使用していることに気づきました。JtaTransactionManagerを使用し、HibernateTemplateを使用しない場合は、セッションを作成するターゲットの周囲に手動でアドバイスを適用する必要があると思います。

また、春に見逃したものかもしれません:https ://jira.springsource.org/browse/SPR-9404

于 2012-06-01T16:43:25.400 に答える
0

デフォルトでは、@Transactionalアノテーションはインターフェースで機能します。インターフェイスを使用しないため、構成の<tx:annotation-driven/>タグにproxy-target-class="true"属性を追加する必要があります。

于 2012-06-01T16:53:33.987 に答える