Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 了解hibernate会话初始化_Java_Spring_Hibernate_Hibernate 5.x - Fatal编程技术网

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;