在OpenSessionInViewFilter会生成一个session并把它放到TransactionSynchronizationManager的ThreadLocal resources里面,这个session默认的是由配置文件中的"sessionFactory"得到的,可以在给OpenSessionInViewFilter你想要实现的sessionFactory。
然后在HibernateTransactionManager的doGetTransaction里面,根据配置文件中的sessionfactory去TransactionSynchronizationManager的Resource里面找相应的sessionHolder,所以如果配置的是同一个sessionfactory的话,就会得到open session in view中的session。
protected Object doGetTransaction()
{
HibernateTransactionObject txObject = new HibernateTransactionObject();
txObject.setSavepointAllowed(isNestedTransactionAllowed());
if(TransactionSynchronizationManager.hasResource(getSessionFactory()))
{
SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(getSessionFactory());
if(logger.isDebugEnabled())
logger.debug("Found thread-bound Session [" + SessionFactoryUtils.toString(sessionHolder.getSession()) + "] for Hibernate transaction");
txObject.setSessionHolder(sessionHolder, false);
if(getDataSource() != null)
{
ConnectionHolder conHolder = (ConnectionHolder)TransactionSynchronizationManager.getResource(getDataSource());
txObject.setConnectionHolder(conHolder);
}
}
return txObject;
}
如果是不同的sessionfactory,在HibernateTransactionManager的doBegin里面有这么一段,很明显就是根据配置文件里的sessionfactory新生成一个session。显然这个和open session in view中的session不是同一个。
if(txObject.getSessionHolder() == null)
{
Interceptor entityInterceptor = getEntityInterceptor();
Session newSession = entityInterceptor == null ? ((Session) (getSessionFactory().openSession())) : ((Session) (getSessionFactory().openSession(entityInterceptor)));
if(logger.isDebugEnabled())
logger.debug("Opened new Session [" + SessionFactoryUtils.toString(newSession) + "] for Hibernate transaction");
txObject.setSessionHolder(new SessionHolder(newSession), true);
}
所以在处理多数据库时,如果设置多个sessionfactory,其中只能有一个能使用open session in view,其他的只能才用其他的方法解决hibernate的延时加载了。
分享到:
相关推荐
3. **使用特定的session管理策略**:对于需要写操作的情况,可以考虑不在这些请求中使用`Open Session In View`。 总之,`Open Session In View`是Spring框架提供的一种高效解决懒加载问题的技术。通过合理配置和...
3. **Open Session in View(OSIV)模式** OSIV模式旨在解决Web应用中,由于用户请求可能会引发多次数据库操作,而这些操作可能跨多个HTTP请求。在这种模式下,Session在整个HTTP请求周期内保持打开状态,直到请求...
这个问题通常发生在使用Spring提供的Open Session In View模式时。 #### Open Session In View 概念 Open Session In View是一种在Spring框架中常用的技术,用于简化Hibernate中的懒加载(lazy loading)机制。通过...
在Spring整合Hibernate的情况下,Session通常通过Transaction Management进行管理,比如使用`Open Session in View`(OSIV)模式或者基于注解的事务管理。 当你尝试在Controller层或者视图层访问懒加载的属性时,...
- 当配合Hibernate的Open Session In View (OSIV) 模式使用时,可以确保在整个HTTP请求过程中只有一个Session,便于进行事务管理。 3. **使用流程**: - 首先,需要配置Hibernate,让其知道如何初始化...
Open EntityManager in View 29.4. Using H2’s Web Console 29.4.1. Changing the H2 Console’s Path 29.5. Using jOOQ 29.5.1. Code Generation 29.5.2. Using DSLContext 29.5.3. jOOQ SQL Dialect 29.5.4. ...
Open Session in View(OSIV)模式是一种常见的Hibernate优化模式,主要用于提高读取操作的性能。在这种模式下,Session在整个HTTP请求周期内保持打开状态。 ##### OSIV 实现方式 - **Servlet Filter 方式**:最常见...
该系统的架构主要包括:Tomcat作为应用服务器,Spring用于业务逻辑层的控制,Hibernate作为ORM(对象关系映射)框架,JOTM(Java Open Transaction Manager)提供事务管理功能,Struts作为MVC(Model-View-...
在某些情况下,如Open Session In View模式,持久化上下文可能会跨越多个事务,以解决懒加载异常。然而,这种模式可能导致性能问题和并发问题,因此需要谨慎使用。此外,使用`@PersistenceContext`的`...
解决方法是确保在Session关闭前完成懒加载操作,或考虑使用Eager Loading或Open Session In View模式。 理解并有效地处理这些异常对于Java开发者来说至关重要,它们能帮助我们诊断并修复问题,保证应用程序的稳定性...
解决方案:理解并合理使用Open Session in View(OSIV)模式,或者在查询时显式调用`Hibernate.initialize()`方法。另外,可以考虑将懒加载改为急加载(Eager Fetching)。 六、HQL查询错误 错误表现:执行HQL语句...
5. **JNDI(Java Naming and Directory Interface)**:JNDI允许应用程序查找和管理资源,如数据库连接池、邮件服务器等。它是服务定位和服务注册的关键组件。 6. **JTA(Java Transaction API)**:为应用程序提供...
- **Web容器**:如Tomcat,负责部署和管理Servlet、JSP等Web组件。 - **应用服务器**:如GlassFish、WebLogic、WildFly等,不仅包含Web容器,还支持EJB和其他JavaEE服务。 4. **开发工具与框架** - **IDE**:...
DatabaseExplorer是MyEclipse提供的一个强大的数据库管理工具,它可以帮助开发者轻松地连接和管理数据库。 **5.2 连接数据库** - **配置数据库连接**:输入数据库服务器地址、端口、用户名和密码等信息。 - **测试...
{7.1}Java的文件系统管理}{103}{section.7.1} {7.2}回调模式与FileFilter}{104}{section.7.2} {7.3}\ttfamily RandomAccessFile}{106}{section.7.3} {7.4}基本类型数据序列化}{108}{section.7.4} {7.5}String的...