2

私はSpringでHibernateを使用しています。関連する設定:

<bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="openSessionInViewInterceptor"  class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
    <property name="sessionFactory"><ref bean="sessionFactory" /></property>
</bean>

<tx:annotation-driven  />
<aop:aspectj-autoproxy />
4

1 に答える 1

5

考えてみてください...

  1. Connection一部のコードはからを取得したいと考えていDataSourceます。おそらく、トランザクションを開始して SQL クエリを実行するため

  2. AbstractRoutingDataSource利用可能なもののセットからdetermineCurrentLookupKey()適切なものを見つけるために実行しますDataSource

  3. ルックアップ キーは、現在の DataSourceを取得するために使用されます。AbstractRoutingDataSourceそのデータ ソースからの JDBC 接続を返します。

  4. AbstractRoutingDataSource通常のソースであるかのように接続が返されます。

determineCurrentLookupKey()がトランザクション内で実行されていない理由を尋ねています。最初に、Spring はポイント 1. に移動して、トランザクションの開始に必要なデータベース接続を取得する必要があります。次の点を見てください。問題が見えますか?無限再帰の匂いがします。

簡単に言えば、トランザクションには接続が必要であり、そのメソッドの目的は接続を取得するためにdetermineCurrentLookupKey()どちらを使用するかを決定することであるため、トランザクション内で実行できません。DataSource参照:鶏か卵か

同様に、エンジニアはコンピューターを使用して最初のコンピューターを設計できませんでした。

于 2012-04-26T18:47:18.937 に答える