`
uule
  • 浏览: 6322379 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Spring+hibernate的session问题

 
阅读更多

在spring框架和hibernate框架集成的时候,根据不同的需求,或者个人的习惯问题。会出现多种多样的数据访问层的代码。本篇文章拣出几个典型的问题,加以浅谈。

DAO层中的某个类如果没有继承自HibernateDaoSupport。而是使用SessionFactory获取对象。(配置文件中已经配置了sessionFactory对象)。可能使用注解进行了注入。

获取session的方式:

1、sessionFactory.openSession();

该方式获取的session是不受spring管理的,在和数据库交互的过程中,需要手动的打开和关闭事务。并且关于session的问题,还是那个原则“谁创建谁关闭”。意思就是,必须手动关闭session。哪怕你使用了@Transactional注解。

 

2、sessionFactory.getCurrentSession();

在一不小心的情况下,可能发生一个异常:

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
 at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
 at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:622)

 

第一种方法:

这个时候可以加入spring提供的事务管理机制来改变这个问题。例如加上@Transactional注解,不过事先要在配置文件中定义好。示例如下:

<tx:annotation-driven transaction-manager="transactionManager" />

 <bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>

 

当然也要引入tx的命名空间。这个时候,不需要显式的开启事务和关闭session的操作,因为spring已经替我们做了。

 

第二种方法:

如果你不打算让spring来管理事务。你可以在配置文件中,加入:

<prop key="hibernate.current_session_context_class">thread</prop>

要 是出现org.hibernate.HibernateException:persist is not valid without active transaction那你就要手动的来开启和关闭事务了。这种情况加入@Transactional注解也是没有作用的。这种情况下session不需 要手动关闭。

 

最后来个小技巧:

如果没有使用spring的组件扫描机制的话,需要在配置文件中配置DAO层的一些类(继承自HibernateDaoSupport)。

其中可能会出现这样的代码:

<bean id="personDao" class="com.dao.PersonDao">
        <property name="sessionFactory" ref="sessionFactory" />
</bean>

 

其中<property name="sessionFactory" ref="sessionFactory" />这个配置,可能会重复N次。

这时候,可以在配置文件中加入:

<bean id="hibernateDaoSupport" abstract="true" class="org.springframework.orm.hibernate3.support.HibernateDaoSupport">
        <propery name="sessionFactory" ref="sessionFactory"/>
</bean>

 

然后再:

<bean id="personDao" class="com.dao.PersonDao" parent="hibernateDaoSupport" />

 

分享到:
评论

相关推荐

    Struts2+Spring+hibernate中对action的单元测试环境搭建[总结].pdf

    TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(hibernateSession)); ``` 然后,在类中加入以下两个私有函数: ```java private SessionFactory lookupSessionFactory...

    struts+spring+hibernate实现图书修改和删除

    在本项目中,Hibernate被用来执行图书数据的CRUD(创建、读取、更新、删除)操作,通过配置文件定义实体类与数据库表的映射,然后通过SessionFactory和Session对象进行数据交互。 **整合SSH** SSH整合的关键在于...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...

    webwork+spring+hibernate 开发资料

    DAO通过Spring管理的HibernateSession与数据库进行交互,执行查询和更新操作。整个过程流畅且高效,使得开发者能专注于业务逻辑,而非底层实现。 在提供的文档“webwork+spring+hibernate架构.doc”中,可能详细...

    Spring+hibernate整合源代码

    1. **依赖注入**:Spring 提供的 DI(Dependency Injection)机制可以帮助管理 Hibernate SessionFactory 和 Session 实例,避免手动创建和管理这些对象。在配置文件中定义 SessionFactory 的 Bean,然后通过注解或 ...

    SSH(Struts+Spring+Hibernate)结合项目简单实例

    同时,Hibernate的SessionFactory和Session对象也会在Spring中配置,使得业务层可以方便地进行数据库操作。Spring还负责管理Hibernate的事务,确保数据一致性。 总结来说,SSH框架组合提供了一个强大且灵活的Java ...

    ZK+spring+hibernate的整合

    4. **配置ZK-Spring**:需要引入ZK-Spring的库,这是一个连接ZK和Spring的桥梁,它提供了Spring的ApplicationContext到ZK Session的绑定,使得ZK组件可以直接使用Spring的Bean。 5. **事务管理**:由于Spring对事务...

    strut+spring+hibernate注册登录系统

    Struts、Spring和Hibernate是Java开发中的三大主流框架,它们的整合使用在企业级应用开发中非常常见。这个"Strut+Spring+Hibernate注册登录系统"是一个基础的Web应用程序,旨在帮助初学者理解如何将这三个框架集成并...

    非注解Springmvc+spring+hibernate 入门实例

    此外,还需要创建`SessionFactory`,它是Hibernate的主要工作单元,负责创建`Session`对象,`Session`则是与数据库交互的接口。 在MvcSpringTest中,你可能还会看到数据访问对象(DAO)和业务服务对象(Service)的...

    dwr+spring+hibernate模板.zip

    - 整合DWR与Hibernate:DWR可以调用Spring管理的bean,这些bean可以进一步调用Hibernate的Session进行数据库操作。通过这种方式,DWR可以直接与数据库交互,实现动态的数据展示和更新。 总结起来,DWR+Spring+...

    Spring + Hibernate + Spring mvc +Ajax 整合

    3. **DAO(Data Access Object)层**:这是与数据库交互的接口,利用Hibernate的Session接口进行CRUD操作。 4. **Service层**:业务逻辑层,通过Spring的依赖注入获取DAO,处理业务规则和事务。 5. **Controller层...

    struts1+spring+hibernate整合所用全部jar包

    Struts1、Spring和Hibernate是Java Web开发中的三大框架,它们各自解决了一部分问题,而将它们整合在一起,可以构建出高效、灵活的企业级应用程序。这里我们主要探讨这三者整合时所需的核心jar包以及它们的功能。 ...

    struts+spring+hibernate 英文 API

    Struts、Spring 和 Hibernate 是Java开发中非常著名的三个开源框架,它们各自负责Web应用程序的不同方面。Struts 是一个用于构建 MVC(模型-视图-控制器)架构的框架,Spring 提供了一个全面的依赖注入(DI)和面向...

    struts+spring+hibernate

    Struts、Spring 和 Hibernate 是Java开发中非常著名的三个开源框架,它们组合在一起形成的SSH(Struts、Spring、Hibernate)框架,是企业级Web应用开发的常用解决方案。SSH框架的整合可以实现模型-视图-控制器(MVC...

    JSF+Spring+Hibernate(框架整合)详细过程

    1. **配置Spring**:首先,我们需要在Spring配置文件中定义Bean,包括JSF Managed Beans和Hibernate Session Factory。Bean的定义可以是XML配置或基于注解的方式。 2. **JSF与Spring的整合**:为了使JSF能够使用...

    spring + hibernate 开发需要 jar包

    1. **hibernate3.jar**:这是Hibernate的核心库,包含了对数据库操作的主要接口和实现,如SessionFactory、Session等,以及实体管理、查询语言(HQL)和事务处理等功能。 2. **xmlbeans-2.3.0.jar**:XMLBeans是一...

    spring+hibernate

    在IT行业中,Spring和Hibernate是两个非常重要的框架,它们在企业级Java应用开发中起着核心作用。Spring是一个全面的后端开发框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及其他许多功能。...

    struts1.2 + spring2.5 + hibernate3.2框架demo

    Struts1.2、Spring2.5和Hibernate3.2是经典的Java企业级开发框架组合,它们各自在应用程序的不同层次上发挥着重要作用。Struts1.2是一个MVC(Model-View-Controller)框架,主要负责处理用户界面与业务逻辑之间的...

    spring +hibernate +maven 的案例

    在DAO层,通过Hibernate的Session接口进行数据库操作,如CRUD(创建、读取、更新、删除)。 6. **测试**:Maven支持各种测试框架,如JUnit,可以用来编写单元测试和集成测试,确保代码质量。 这个案例展示了如何在...

Global site tag (gtag.js) - Google Analytics