3

私は使用してSpring 4.2.1おりHiberante 5、Spring Bean 定義で宣言されたセッションを次のように春が初期化する方法を理解しようとしています。

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <!-- properties -->
</bean>

いわゆるorg.springframework.orm.hibernate5.LocalSessionFactoryBeanが実装されていることがわかりましたFactoryBean<SessionFactory>これを考慮に入れるSessionFactoryと、定義をクラスに注入するように定義しているorg.springframework.orm.hibernate5.LocalSessionFactoryBeanのに、最終的に のインスタンスになってしまう理由は明らかですSessionFactory。さて、私が混乱したのはメソッドgetCurrentSessionです:

public Session  getCurrentSession() throws HibernateException {
    if ( currentSessionContext == null ) {
        throw new HibernateException( "No CurrentSessionContext configured!" );
    }
    return currentSessionContext.currentSession();
}

これは、実際のセッション作成をSpringSessionContextに委任します。私の場合、このコードによって取得されています。

SessionHolder sessionHolder = (SessionHolder) value;
Session session = sessionHolder.getSession();

しかし、session実際には、それ自体がプロパティprotected transient SessionFactoryImpl factoryorg.hibernate.internal.SessionImplを持つ直接基本クラスのインスタンスです。org.hibernate.internal.AbstractSessionImpl

したがって、私の場合は実際のインスタンスを保持SessionFactoryするCurrentSessionContextプロパティがあります。しかし、再びタイプのプロパティがあります。SessionHolderSessionSessionImplSessionFactory

循環が理解できません。ちょっと説明していただけませんか。

4

1 に答える 1

1

まあ、Spring の実装でCurrentSessionContextは保持されずSessionHolder、代わりにそのメソッドが呼び出されるSessionholderたびに取得されます。currentSessionこれを参照してください:

Object value = TransactionSynchronizationManager.getResource(this.sessionFactory);
...
SessionHolder sessionHolder = (SessionHolder) value;

したがって、あなたの場合、いくつかの実装が注入されていますが、構成が異なる場合は別の実装になる可能性があります。

その設計の主な目的は、関心を適切に分離することだと思います。の主な目的は、SessionContextトランザクション マネージャーとセッション ホルダーを関連付けて、トランザクションの構成に応じて適切に構成されたセッションを提供することです。

の他の実装がありCurrentSessionContextます。hibernate には少なくとも 3 つの実装があると思います。そのため、説明したシナリオは、そのようなクラスを注入するスプリング構成に依存します。

javaDoc が述べているように:

CurrentSessionContext 実装は、「hibernate.current_session_context_class」を介してカスタム SessionFactory セットアップで指定することもできます。

于 2015-10-25T07:56:57.353 に答える