3

我正在使用Spring 4.2.1并且Hiberante 5现在试图了解spring如何初始化在Spring Beans定义中声明的Session,如下所示:

<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它实际上是org.hibernate.internal.SessionImpl直接基类org.hibernate.internal.AbstractSessionImpl的一个实例,它本身具有受保护的瞬态 SessionFactoryImpl factory属性。

因此,在我的情况下,它SessionFactory拥有的CurrentSessionContext属性SessionHolder又拥有实际的Session实例。但是SessionImplanother 具有 type 的属性SessionFactory

我无法理解通函。你能不能解释一下。

4

1 回答 1

1

好吧,Spring 的实现CurrentSessionContext不持有SessionHolder,而是Sessionholder在每次currentSession调用该方法时检索。看到这个:

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

因此,在您的情况下,注入了一些实现,但如果配置不同,它可以是另一种实现。

我认为该设计的主要目的是很好地分离关注点。的主要目的SessionContext是关联事务管理器和会话持有者,以便根据事务配置为您提供配置良好的会话。

还有其他的实现CurrentSessionContext,我相信hibernate至少有三个实现,所以你描述的场景取决于注入这些类的spring配置。

正如javaDoc所说:

CurrentSessionContext 实现也可以通过“hibernate.current_session_context_class”在自定义 SessionFactory 设置中指定

于 2015-10-25T07:56:57.353 回答