Java 了解hibernate会话初始化
我正在使用Java 了解hibernate会话初始化,java,spring,hibernate,hibernate-5.x,Java,Spring,Hibernate,Hibernate 5.x,我正在使用Spring 4.2.1和hibernate 5,现在试图理解Spring如何初始化Spring bean定义中声明的会话,如下所示: <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- properties --> </bean> 它将实际会话创建委托给,在我的情况下,它将通过以下方式检索: 但
Spring 4.2.1
和hibernate 5
,现在试图理解Spring如何初始化Spring bean定义中声明的会话,如下所示:
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- properties -->
</bean>
它将实际会话创建委托给,在我的情况下,它将通过以下方式检索:
但是会话
实际上是org.hibernate.internal.SessionImpl
的一个实例,该直接基类org.hibernate.internal.AbstractSessionImpl
本身具有属性
因此,SessionFactory
具有CurrentSessionContext
属性,在我的例子中,该属性持有SessionHolder
,而SessionHolder又持有实际的Session
实例。但是SessionImpl
同样具有类型为SessionFactory
的属性
我不能理解这个通告。您不能解释一下吗。好吧,
CurrentSessionContext
的Spring实现不会保存SessionHolder
,而是每次调用currentSession
方法时都会检索SessionHolder
。见此:
Object value = TransactionSynchronizationManager.getResource(this.sessionFactory);
...
SessionHolder sessionHolder = (SessionHolder) value;
因此,在您的情况下,有一些实现,但在不同配置的情况下,可以是另一个实现
我认为该设计的主要目的是将关注点很好地分离。SessionContext
的主要目的是将事务管理器和会话持有者关联起来,根据事务配置为您提供配置良好的会话
还有其他的CurrentSessionContext
实现,我相信hibernate至少有三个实现,所以您描述的场景取决于注入此类类的spring配置
正如javaDoc所述:
还可以通过“hibernate.current\u session\u context\u类”在自定义SessionFactory设置中指定CurrentSessionContext实现
是的,的确,你完全正确。我发现
TransactionSynchronizationManager
有一个名为resources
的私有静态ThrealLocal
字段。而实际绑定会话持有者
的方法是将会话插入作为新会话持有者(会话)
包装到持有者中,然后使用键会话工厂
进行绑定。但仍然有点难以理解循环是如何提供关注点分离的。。。。
SessionHolder sessionHolder = (SessionHolder) value;
Session session = sessionHolder.getSession();
Object value = TransactionSynchronizationManager.getResource(this.sessionFactory);
...
SessionHolder sessionHolder = (SessionHolder) value;