`

SSH中使用getCurrentSession()获得session使用时注意事项,Hibernate,项目经验

阅读更多

SSH中使用getCurrentSession()获得session

 

  1. 在hibernate的配置文件中增加属性:

     

    <property name="current_session_context_class">thread</property>

    如下表红色部分

    Java代码  收藏代码
    1. <hibernate-configuration>  
    2.   
    3. <session-factory>  
    4.   
    5.    <property name="connection.username">root</property>  
    6.   
    7.    <property name="connection.url">  
    8.   
    9.     jdbc:mysql://localhost:3306/dbtest  
    10.   
    11.    </property>  
    12.   
    13.    <property name="dialect">  
    14.   
    15.     org.hibernate.dialect.MySQLDialect  
    16.   
    17.    </property>  
    18.   
    19.    <property name="myeclipse.connection.profile">dbtest</property>  
    20.   
    21.    <property name="connection.password">123456</property>  
    22.   
    23.    <property name="connection.driver_class">  
    24.   
    25.     com.mysql.jdbc.Driver  
    26.   
    27.    </property>  
    28.   
    29.    <property name="show_sql">true</property>  
    30.   
    31.   <property name="current_session_context_class">thread</property>  
    32.   
    33.    <mapping resource="com/pc386/hibernate/entity/User.hbm.xml" />  
    34.   
    35.     
    36.   
    37. </session-factory>  
    38.   
    39. </hibernate-configuration>  
    40.    

     

    在SSH中,如果把hibernate交给Spring的管理事物中,那么应该修改Spring的配置文件applicationContext.xml文件的属性,在sessionFactory的属性中增加: <prop key="current_session_context_class">thread</prop>
    Java代码  收藏代码
    1. bean id="sessionFactory"   
    2.   
    3. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    4.   
    5. <property name="dataSource">  
    6.   
    7.    <ref local="dataSource"/>  
    8.   
    9. </property>  
    10.   
    11. <property name="mappingResources">  
    12.   
    13.    <list>  
    14.   
    15.     <value>User.hbm.xml </value>  
    16.   
    17.    </list>  
    18.   
    19. </property>  
    20.   
    21. <property name="hibernateProperties">  
    22.   
    23.    <props>  
    24.   
    25.     <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>  
    26.   
    27. <!--  
    28.   
    29.     <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>  
    30.   
    31. -->  
    32.   
    33.     <prop key="hibernate.current_session_context_class">thread</prop>  
    34.   
    35.    </props>  
    36.   
    37. </property>  
    38.   
    39. </bean>  
    40.    
     原文出处
  2. http://blog.csdn.net/daryl715/archive/2007/02/11/1507385.aspx
    Java代码  收藏代码
    1. No CurrentSessionContext configured!" 异常解决方案  
    2.   
    3. hibernate 老说没有配方言  
    4.   
    5. <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
    6.   
    7. 这句话明明就写在了配置文件里面,可老是没有写  
    8.   
    9. 错误如下:  
    10.   
    11. Exception in thread "main" org.hibernate.HibernateException: Hibernate Dialect must be explicitly set  
    12.   
    13. name改成"hibernate.dialect"也不行  
    14.   
    15. Hibernate-Version: 3.1.1  
    16.   
    17. mysql -Verison: 4.0.16  
    18.   
    19. 用这种方法正确  
    20.   
    21. static {  
    22.   
    23. try {  
    24.   
    25. configuration = new Configuration();  
    26.   
    27. sessionFactory = configuration.configure().buildSessionFactory();  
    28.   
    29. catch (Throwable ex) {  
    30.   
    31. throw new ExceptionInInitializerError(ex);  
    32.   
    33. }  
    34.   
    35. }  
    36.   
    37. 这种方式会出现异常  
    38.   
    39. // static {  
    40.   
    41. // try {  
    42.   
    43. // // Create a configuration based on the properties file we've put  
    44.   
    45. // Configuration config = new Configuration();  
    46.   
    47. // config.addClass(Customer.class).addClass(Order.class);  
    48.   
    49. // // Get the session factory we can use for persistence  
    50.   
    51. // sessionFactory = config.buildSessionFactory();  
    52.   
    53. // } catch (Exception e) {  
    54.   
    55. // e.printStackTrace();  
    56.   
    57. // }  
    58.   
    59. // }  
    60.   
    61. 第二种方式是针对使用properties文件配置hiernate的写法,使用hibernate.cfg.xml应使用第一种调用方式  
    62.   
    63. 或者在hibernate.cfg.xml中加入:  
    64.   
    65. <property name="current_session_context_class">thread</property>  
     http://blog.sina.com.cn/s/blog_412d58ec010005p5.html
    Java代码  收藏代码
    1. 以前单独用Hibernate2.0的时候,为了保证一个线程中每次取出的session都是一个对象,就使用官方提供的一个HibernateUtils,将第一次取出的session放入ThreadLocal中,以后每次从这里面取出的session都是一个对象,可以保证事务的正常执行。  
    2.   
    3. 后来升级到3.0,也这样延用下去,没怎么关心3.0的新特性。  
    4.   
    5. 前几天想将Hibernate加入到SPRING的事务管理中,但是我又不想使用spring提供的HibernateDaoSupport或HibernateTemplate,只想像以前那样在一个线程中的任意地方都能得到同一个session。这样就出问题了,spring管理事务的话,如果要保证当前线程内只有一个session,需要将sessionFactory传递给org.springframework.orm.hibernate3.HibernateTransactionManager,spring负责事务的开始,提交,回滚以及session的关闭,假设spring用于管理事务的session是(session1)。如果我还用HibernateUtils.getCurrentSession()方法获得session的话,得到的session却是(session2),和开始事务的session不是同一个对象,就造成session2的事务没有提交,对数据库的操作无效。  
    6.   
    7. 后来搜索到原来Hibernate3.0以后,sessionFactory多了个新的方法getCurrentSession()。我心里很高兴,这样不就解决我的问题了吗?  
    8.   
    9. 于是我就将HibernateUtils中的session=sessionFactory.openSession()方法改为了session=sessionFactory.getCurrentSession().  
    10.   
    11. 运行测试竟然错了,  
    12.   
    13. 提示什么TransactionManager出错了,上网上搜了搜,原来使用getCurrent方法必须配置事务管理,需要和jta或thread绑定。我不想用jta,当然要和线程绑定了。我在hibernate的配置文件中加入了<property name="current_session_context_class">thread</property>,又运行,还是出同样的错误。继续上网上查资料,基本没有相关资料。后来费了好大劲才发现,原来在hibernate3.0里只能和jta绑定,我copy了新的3.2的包,这下可以了。不出那个事务管理的错了,变成了org.hibernate.HibernateException: save is not valid without active transaction错误。继续搜,只有一个相关资料,说使用getCurrentSession()方法必须在事务中运行。不管查询还是更新操作都要开始事务,操作,提交事务才行。  
    14.   
    15. 可是我已经配置了让spring管理事务,为什么出这个错误?看来只有一个原因,spring在通过sessionFactory获取session时,没有调用getCurrentSession()方法。  
    16.   
    17. 自己手动加入事务的开始,提交,成功了。  
    18.   
    19. 经过多次实验,发现,只能能spring中配置sessionFactory,才能让spring管理hibernate的事务。  
    20.   
    21. <bean id="sessionFactory"  
    22.   
    23. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    24.   
    25. <property name="dataSource">  
    26.   
    27.    <ref local="dataSource"/>  
    28.   
    29. </property>  
    30.   
    31. <property name="mappingResources">  
    32.   
    33.    <list>  
    34.   
    35.     <value>User.hbm.xml </value>  
    36.   
    37.    </list>  
    38.   
    39. </property>  
    40.   
    41. <property name="hibernateProperties">  
    42.   
    43.    <props>  
    44.   
    45.     <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>  
    46.   
    47. <!--  
    48.   
    49.     <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>  
    50.   
    51. -->  
    52.   
    53.     <prop key="hibernate.current_session_context_class">thread</prop>  
    54.   
    55.    </props>  
    56.   
    57. </property>  
    58.   
    59. </bean>  
    60.   
    61. 在程序中要用到session的时候,过程如下 :  
    62.   
    63. UserDAOImpl:  
    64.   
    65. {  
    66.   
    67. SessionFactory sf = [从spring中得到sessionFactory];  
    68.   
    69. Session session = sf.getCurrentSession();  
    70.   
    71. //数据库操作  
    72.   
    73. }  
    74.   
    75. 这么乱。写一下总结。  
    76.   
    77. 1. 如果想让spring帮你管理事务,只能在spring中配置SessionFactory。如果使用hibernate原有的sessionFactory,则只能自己手动管理事务。  
    78.   
    79. 2. 如果想使用sessionFactory.getCurrentSession()方法,必须配置sessionFactory和jta或thread绑定。但是hibernate3.0不支持与thread绑定,3.1以上才支持。  
    80.   
    81. 3. sessionFactory.getCurrentSession()方法取得的session,在做数据库操作时必须在事务中做,包括只读的查询,否则会报错。  
    82.    
     
分享到:
评论

相关推荐

    ssh中getCurrentSession的使用

    在描述中提到的"ssh中getCurrentSession的使用",实际上可能是指在SSH集成框架中使用Hibernate框架时,获取数据库会话(Session)的方法。 在Hibernate中,`getCurrentSession()`是SessionFactory类的一个方法,它...

    新Hibernate SessionFactory().getCurrentSession()猫腻

    在传统的Hibernate使用模式中,开发者通常会在每个事务开始时创建一个新的Session,并在事务结束时关闭它。然而,`SessionFactory.getCurrentSession()`方法提供了一种不同的方式来获取Session,这种方式旨在支持...

    基于IDEA的SSH项目之五:集成Hibernate--程序包

    在本教程中,我们将深入探讨如何在基于IntelliJ IDEA(IDEA)的SSH(Spring、Struts2和Hibernate)项目中集成Hibernate框架。SSH是一个流行的企业级Java应用开发框架组合,而Hibernate作为ORM(对象关系映射)工具,...

    ssh框架的模糊查询

    在SSH框架中,这通常通过在Hibernate的HQL(Hibernate Query Language)或者SQL语句中使用LIKE关键字实现。例如,我们可以创建一个方法,在Service层接收用户输入的查询条件,然后通过DAO调用对应的HQL,如下所示: ...

    SSH整合学习笔记之spring与hibernate整合(二)之c3p0

    整合Spring和Hibernate时,我们需要在Spring的配置文件中定义数据源,这里就是使用c3p0作为数据源。以下是一个简单的配置示例: ```xml &lt;!-- c3p0配置属性 --&gt; ``` 接下来,我们还需要配置...

    SSH中增删改查的思想之我见

    SSH框架,即Struts+Spring+Hibernate,是Java Web开发中非常流行的一个组合,它将前端展示、业务逻辑处理以及数据持久化三个层次的功能有效地分离出来,极大地提高了开发效率和代码的可维护性。 本文旨在深入探讨...

    hibernate.jar包

    《SSH框架下Hibernate核心库详解》 在Java企业级开发中,SSH(Spring、Struts、Hibernate)是一个经典的三大框架...然而,使用时也需要注意其潜在的性能问题和学习成本,合理地进行优化和设计,以实现最佳的开发效果。

    SSM SSH面试题整理

    - getCurrentSession():如果当前事务中已有session,则直接使用,否则创建一个新的。 - openSession():每次都创建一个新的session,适用于需要手动管理事务的场景。 **Hibernate缓存机制:** - 一级缓存(Session...

    SSH框架搭配,spring+struts+hibernate框架搭配步骤

    SSH 框架搭配,Spring+Struts+Hibernate 框架搭配步骤 SSH 框架搭配是指将 SSH 三大框架(Spring、Struts、Hibernate)集成到一起,实现了一个完整的 Web 应用程序开发解决方案。下面是 SSH 框架搭配的详细步骤: ...

    SSH-Jsp期末考试简答题带答案

    openSession()和getCurrentSession()是Hibernate中两个重要的Session创建方法。采用getCurrentSession()创建的Session会绑定到当前的线程中去,而采用openSession()则不会。getCurrentSession()创建的Session在...

    Hibernate4Spring3

    在Spring中,我们可以使用`SessionFactory.openSession()`或`SessionFactory.getCurrentSession()`方法获取Session实例。 4. **事务管理**:Spring提供了声明式事务管理,只需在方法上添加@Transactional注解,即可...

    SSH一对多(两表双向关联查询)

    SSH一对多(两表双向关联查询)是一种在Java Web开发中常见的数据操作方式,主要涉及到Spring、Struts和Hibernate这三大框架的集成使用。在这个场景下,我们将关注于如何通过Hibernate来实现数据库中的两个表——...

    SSH动态切换数据源

    SSH动态切换数据源是一种在Java Web开发中处理多数据库连接切换的技术,主要应用于Spring、Struts和Hibernate(SSH)这三大框架集成的项目。SSH框架是企业级应用开发的常用组合,提供了强大的业务逻辑处理和数据持久...

    ssh框架,简单代码例子

    SSH框架,全称为Struts2、Spring和Hibernate的组合,是Java Web开发中常见的三大开源框架集成。这个框架集合提供了模型-视图-控制器(MVC)架构模式,用于构建高效、可维护的Web应用程序。下面我们将深入探讨SSH框架...

    SSh sql/hql 分页

    ### SSh sql/hql 分页知识点解析 #### 一、概览 在软件开发中,分页是一项常用的技术,尤其在网络应用中...同时,也需要注意避免简单复制代码而不理解其背后的原理,这样才能更好地掌握分页技术并应用于实际项目中。

    SSH查询代码

    SSH(Struts2 + Spring + Hibernate)是一种经典的Java Web开发框架组合,用于构建高效、可扩展...在实际项目中,你可能还会涉及到缓存、安全、国际化等更多细节,但SSH已经为你提供了一个强大的基础来构建和扩展应用。

    SSH2整合详细示例

    ### SSH2整合详细示例 #### 一、前言 在Java Web开发领域,Struts2、Hibernate与Spring(简称SSH)三个框架被广泛应用于构建企业级应用系统。本示例将详细介绍如何整合这三个框架,实现一个简单的增删改查(CRUD)...

    ssh的例子实现了分页的查询

    在`UserDAOImpl`中,我们可以使用Hibernate的Session对象执行HQL(Hibernate查询语言)或者SQL语句,实现分页查询。例如: ```java public List&lt;User&gt; listUsersByPage(int currentPage, int pageSize) { Session ...

    OA项目SSH整合框架

    1,对于集合属性,默认是lazy="true"的,在第一次使用时才加载。 2,但在加载时,如果Session已经关掉了就会抛LazyInitializationException异常 二,集成 Spring 与 Struts2.1.8.1 1,在web.xml配置监听器...

    struts2.3+spring3.1.2+hibernate4.1.6 配置说明

    例如,可以使用`SessionFactory.getCurrentSession()`来替代`HibernateTemplate`,并在DAO层注入`SessionFactory`,以便于管理Session。 在Spring的配置中,使用了`OpenSessionInViewFilter`来处理数据库会话的生命...

Global site tag (gtag.js) - Google Analytics