`
javachikuang
  • 浏览: 72101 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

SSH中使用getCurrentSession()获得session

阅读更多
    1. 在hibernate的配置文件中增加属性: 
       <property name="current_session_context_class">thread</property>
      如下表红色部分
    1. <hibernate-configuration>

     <session-factory>
      <property name="connection.username">root</property>
      <property name="connection.url">
       jdbc:mysql://localhost:3306/dbtest
      </property>
      <property name="dialect">
       org.hibernate.dialect.MySQLDialect
      </property>
      <property name="myeclipse.connection.profile">dbtest</property>
      <property name="connection.password">123456</property>
      <property name="connection.driver_class">
       com.mysql.jdbc.Driver
      </property>
      <property name="show_sql">true</property>
      <property name="current_session_context_class">thread</property>
      <mapping resource="com/pc386/hibernate/entity/User.hbm.xml" />
      
     </session-factory>

    </hibernate-configuration>

    1. 在SSH中,如果把hibernate交给Spring的管理事物中,那么应该修改Spring的配置文件applicationContext.xml文件的属性,在sessionFactory的属性中增加: <prop key="current_session_context_class">thread</prop>
      1. bean id="sessionFactory"
          class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
          <property name="dataSource">
           <ref local="dataSource"/>
          </property>
          <property name="mappingResources">
           <list>
            <value>User.hbm.xml </value>
           </list>
          </property>
          <property name="hibernateProperties">
           <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
        <!--
            <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
         -->
            <prop key="hibernate.current_session_context_class">thread</prop>
           </props>
          </property>
         </bean>
    1. 原文出处
    2. http://blog.csdn.net/daryl715/archive/2007/02/11/1507385.aspx

       No CurrentSessionContext configured!" 异常解决方案

      hibernate 老说没有配方言

      <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
      这句话明明就写在了配置文件里面,可老是没有写
      错误如下:
      Exception in thread "main" org.hibernate.HibernateException: Hibernate Dialect must be explicitly set

      name改成"hibernate.dialect"也不行

      Hibernate-Version: 3.1.1
      mysql -Verison: 4.0.16


      用这种方法正确
      static {

      try {
      configuration = new Configuration();

      sessionFactory = configuration.configure().buildSessionFactory();
      } catch (Throwable ex) {

       

      throw new ExceptionInInitializerError(ex);
      }
      }

      这种方式会出现异常
      // static {
      // try {
      // // Create a configuration based on the properties file we've put
      // Configuration config = new Configuration();
      // config.addClass(Customer.class).addClass(Order.class);
      // // Get the session factory we can use for persistence
      // sessionFactory = config.buildSessionFactory();
      // } catch (Exception e) {
      // e.printStackTrace();
      // }
      // }

      第二种方式是针对使用properties文件配置hiernate的写法,使用hibernate.cfg.xml应使用第一种调用方式

      或者在hibernate.cfg.xml中加入:

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


       

    3. http://blog.sina.com.cn/s/blog_412d58ec010005p5.html

      以前单独用Hibernate2.0的时候,为了保证一个线程中每次取出的session都是一个对象,就使用官方提供的一个HibernateUtils,将第一次取出的session放入ThreadLocal中,以后每次从这里面取出的session都是一个对象,可以保证事务的正常执行。
      后来升级到3.0,也这样延用下去,没怎么关心3.0的新特性。
      前几天想将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的事务没有提交,对数据库的操作无效。
      后来搜索到原来Hibernate3.0以后,sessionFactory多了个新的方法getCurrentSession()。我心里很高兴,这样不就解决我的问题了吗?
      于是我就将HibernateUtils中的session=sessionFactory.openSession()方法改为了session=sessionFactory.getCurrentSession().
      运行测试竟然错了,
      提示什么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()方法必须在事务中运行。不管查询还是更新操作都要开始事务,操作,提交事务才行。
      可是我已经配置了让spring管理事务,为什么出这个错误?看来只有一个原因,spring在通过sessionFactory获取session时,没有调用getCurrentSession()方法。
      自己手动加入事务的开始,提交,成功了。
      经过多次实验,发现,只能能spring中配置sessionFactory,才能让spring管理hibernate的事务。
       <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
         <ref local="dataSource"/>
        </property>
        <property name="mappingResources">
         <list>
          <value>User.hbm.xml </value>
         </list>
        </property>
        <property name="hibernateProperties">
         <props>
          <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
      <!--
          <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
       -->
          <prop key="hibernate.current_session_context_class">thread</prop>
         </props>
        </property>
       </bean>
      在程序中要用到session的时候,过程如下 :
      UserDAOImpl:
      {
      SessionFactory sf = [从spring中得到sessionFactory];
      Session session = sf.getCurrentSession();
      //数据库操作
      }

      这么乱。写一下总结。
      1. 如果想让spring帮你管理事务,只能在spring中配置SessionFactory。如果使用hibernate原有的sessionFactory,则只能自己手动管理事务。
      2. 如果想使用sessionFactory.getCurrentSession()方法,必须配置sessionFactory和jta或thread绑定。但是hibernate3.0不支持与thread绑定,3.1以上才支持。
      3. sessionFactory.getCurrentSession()方法取得的session,在做数据库操作时必须在事务中做,包括只读的查询,否则会报错。

    分享到:
    评论

    相关推荐

      ssh中getCurrentSession的使用

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

      新Hibernate SessionFactory().getCurrentSession()猫腻

      至于压缩包中的文件名称列表,"新建文本文档"和"ssh2"并不直接与Hibernate或`getCurrentSession()`相关,可能是其他内容或资料,如SSH2可能是指Secure Shell的版本2,用于远程访问和管理服务器,与数据库操作无关。...

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

      ### SSH中增删改查的思想之我见 #### 概述 在软件开发尤其是Web应用开发领域中,增删改查(CRUD)操作是最基本也是最核心的需求之一。SSH框架,即Struts+Spring+Hibernate,是Java Web开发中非常流行的一个组合,它...

      ssh框架的模糊查询

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

      SSM SSH面试题整理

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

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

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

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

      采用getCurrentSession()创建的Session会绑定到当前的线程中去,而采用openSession()则不会。getCurrentSession()创建的Session在commit或rollback后会自动关闭,而openSession()必须手动关闭。在每个方法执行的时候...

      SSH动态切换数据源

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

      SSh sql/hql 分页

      Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); Query query = session.createQuery("from YourEntity e"); query.setFirstResult((page - 1) * pageSize); query....

      ssh框架,简单代码例子

      Session session = sessionFactory.getCurrentSession(); return session.get(User.class, id); } // other CRUD methods } ``` 6. **JSP页面显示**: 创建JSP页面如`success.jsp`或`error.jsp`来展示结果。 `...

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

      3. 在DAO实现类中使用Hibernate执行分页查询。 4. 在Struts2配置文件中定义结果视图,并在JSP页面上展示数据和构建分页链接。 通过这种方式,我们能够有效地在SSH框架下实现分页查询,提升用户体验并优化系统性能。...

      SSH查询代码

      Session session = sessionFactory.getCurrentSession(); Criteria criteria = session.createCriteria(YourEntity.class) .add(Restrictions.eq("param", queryParam)); return criteria.list(); } } ``` 在...

      ssh 分页代码(延迟加载)

      在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而这里的"ssh 分页代码(延迟加载)"指的是在SSH框架下实现分页查询时采用的延迟加载技术。延迟加载是一种优化策略,它允许我们在...

      SSH2整合详细示例

      Session session = sessionFactory.getCurrentSession(); return (User) session.get(User.class, id); } } ``` #### 六、业务逻辑层设计 1. **UserService.java**: ```java package ...

      SSH框架的分页

      Session session = sessionFactory.getCurrentSession(); Query query = session.createQuery("from TblNews"); int offset = (pageNo - 1) * pageSize; query.setFirstResult(offset); query.setMaxResults...

      OA项目SSH整合框架

      2,但在加载时,如果Session已经关掉了就会抛LazyInitializationException异常 二,集成 Spring 与 Struts2.1.8.1 1,在web.xml配置监听器(Spring Reference 15.2 Common configuration) &lt;!-- 集成Spring -...

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

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

      ssh2分页代码

      Session session = sessionFactory.getCurrentSession(); Query query = session.createQuery("from Member"); query.setFirstResult(start); query.setMaxResults(size); return query.list(); } } ``` ####...

      SSH框架部分常见面试题.pdf

      openSession 和 getCurrentSession 是 Hibernate 中的两个会话方法,openSession 用于创建新的会话,getCurrentSession 用于获取当前会话。 saveOrUpdate() 和 merge() saveOrUpdate() 和 merge() 是 Hibernate 中...

    Global site tag (gtag.js) - Google Analytics