`
john.zhang
  • 浏览: 16109 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SessionFactory对象中getCurrentSession() 和 OpenSession()的区别

 
阅读更多

SessionFactory.getCurrentSession与openSession的区别


  a.  如果使用的是getCurrentSession来创建session的话,在commit后,session就自动被关闭了,也就是不用再     session.close()了。但是如果使用的是openSession方法创建的session的话,
  那么必须显示的关闭session,也就是调用session.close()方法。这样commit后,session并没有关闭
 b.  getCurrentSession的使用可以参见hibernate\hibernate-3.2\doc\tutorial\src项目
 c.  使用SessionFactory.getCurrentSession()需要在hibernate.cfg.xml中如下配置:
  * 如果采用jdbc独立引用程序配置如下:
  <property name="hibernate.current_session_context_class">thread</property>
  * 如果采用了JTA事务配置如下  
  <property name="hibernate.current_session_context_class">jta</property>

 

 

1. Dao里面写了一个方法

  SessionFactory sf = hibernateTemplate.getSessionFactory();
  Session s = sf.getCurrentSession();
  //用spring管理了事务,不用写beginTransaction()
  //s.beginTransaction();
  s.createQuery("update User u set u.name=:name,u.address=:address  where id = :id")
  .setString("name", "zhangqiang")
  .setString("address", "北京市,海淀区")
  .setString("id", "2").executeUpdate();
  //s.getTransaction().commit();

 

2.  因为在spring中已经配置了事务,这里在写beginTransaction(),就会报
Transaction not successfully started异常

将其代码注释,如上面代码

附上spring中的事务配置

<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 1. 配置基于 注解的事务驱动
<tx:annotation-driven transaction-manager="transactionManager"/>
 -->
	 
<!-- 2.1 声明事物通知 方法使用哪些事物属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
	<tx:attributes>
		<!-- 配置事务属性 为那些方法配置事物属性,eg:事物传播性(REQUIRES(常用), REQUIERS_NEW),事物的隔离级别,设置事物的回滚属性(运行异常, 检查异常(IOException)),事物超时回滚时间, 事物是否只读 -->
		<tx:method name="insert" propagation="REQUIRED"/>
		<tx:method name="update" propagation="REQUIRED"/>
		<tx:method name="get*" propagation="REQUIRED"/>
		<tx:method name="delete" propagation="REQUIRED"/>
		<tx:method name="findAll*" read-only="true"/>
	</tx:attributes>
</tx:advice> 
	
<!-- 2.2 配置事务的应用 配置对哪些类的哪些方法使用事物管理 -->
<aop:config proxy-target-class="true">
	<aop:pointcut expression="execution(* com.tieba.hibernate.dao.*.*(..))" id="txPontCut" />
	<aop:advisor advice-ref="txAdvice" pointcut-ref="txPontCut" />
</aop:config>

  

 

3. 或者将SessionFactory.getCurrentSession() 改为 SessionFactory.OpenSession();

分享到:
评论

相关推荐

    SessionFactory.getCurrentSession与openSession的区别

    标题中的“SessionFactory.getCurrentSession与openSession的区别”是关于Hibernate框架中的两个关键操作,它们都是用于在Hibernate中获取数据库会话的。理解它们的区别对于优化数据访问性能和管理事务至关重要。 ...

    getCurrentSession 与 openSession() 的区别

    在Java的Hibernate框架中,`getCurrentSession()` 和 `openSession()` 都是用于获取与数据库交互的Session对象,但它们之间存在显著的区别。理解这些差异对于优化数据访问性能和管理事务至关重要。 首先,`...

    新Hibernate SessionFactory().getCurrentSession()猫腻

    标题中的“新Hibernate SessionFactory().getCurrentSession()猫腻”指的是在使用Hibernate ORM框架时,一个常见但不为人熟知的细节,即SessionFactory().getCurrentSession()方法的使用。在深入讲解这个知识点之前...

    ssh中getCurrentSession的使用

    在Hibernate中,`getCurrentSession()`是SessionFactory类的一个方法,它用于获取当前线程绑定的Session对象。这个方法在处理数据库操作时非常有用,因为每个HTTP请求通常对应一个独立的线程,每个线程都应该有自己...

    J2EE考试题目及答案定义.pdf

    六、SessionFactory中的openSession()和getCurrentSession()方法 openSession()和getCurrentSession()方法都是用于获取Session对象的方法,但它们有所不同。getCurrentSession创建的Session对象会和当前...

    J2EE考试题目及答案.doc

    本文主要探讨了几个关于J2EE的重要知识点,包括其四层模型、对象持久化、ORMapping(对象关系映射)、使用Hibernate实现对象持久化的步骤、序列化的作用,以及SessionFactory和Session中的特定方法的区别。...

    2020版Hibernate 12 道.pdf

    11. Hibernate中getCurrentSession和openSession的区别是什么? `getCurrentSession`是用于在已有的事务上下文中获取或创建Session,确保与当前事务的一致性。而`openSession`则是直接创建一个新的Session,不考虑...

    hibernate学习笔记

    - 提供`openSession()`和`getCurrentSession()`方法: - `openSession()`每次创建新Session,使用后需关闭。 - `getCurrentSession()`提供线程绑定的Session,方便事务管理。 总结,Hibernate通过O/R Mapping...

    spring_hibernate_annotation的三种实现

    在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别专注于依赖注入和对象关系映射。本篇文章将探讨如何在实际开发中结合Spring和Hibernate,利用注解来实现数据访问层(DAO)的操作。注解使得代码更加...

    JAVAEE试题(含答案).docx

    6. Hibernate框架中的SessionFactory类:SessionFactory类提供了两个获得session的方法,分别是openSession()和getCurrentSession()。这两个方法的区别在于,openSession()方法可以在一个线程中使用不同的Session,...

    [尚硅谷]_佟刚_Hibernate面试题分析

    8. getCurrentSession()和openSession()的区别: - getCurrentSession()会检查当前线程是否已有Session,若有则返回,若无则创建。 - openSession()方法总是创建一个新的Session。 - getCurrentSession()在事务...

    JAVAEE试题(含答案).pdf

    6. Hibernate 框架中的 SessionFactory 类有两个获得 session 的方法:openSession() 和 getCurrentSession()。如果需要在同一线程中,保证使用同一个 Session 则使用 getCurrentSession(),如果在一个线程中,需要...

    Hibernate4Spring3

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

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

    框架定义了类和对象的责任,类和对象如何互相协作,以及对象之间的控制线程。这些共有的设计因素由框架预先定义,应用开发人员只须关注于特定的应用系统特有部分。框架着重于设计复用。 在Java EE开发中,使用框架...

    Spring与Hibernate集成中的session

    在Java Web开发中,Spring和Hibernate是两个非常重要的框架,它们分别处理依赖注入和对象关系映射(ORM)。本文将详细探讨Spring与Hibernate的集成,特别是如何在集成环境中使用和管理`Session`。 首先,Spring作为...

    hibernate-spring整合

    在Spring中,我们可以使用SessionFactory的openSession()或getCurrentSession()方法获取Session实例。 4. **事务管理**: Spring提供PlatformTransactionManager接口,可以用来管理数据库事务。在Hibernate整合中,...

    hibernate3中通过nativesql或取部分字段并映射为具体对象的实现

    Session session = sessionFactory.getCurrentSession(); SQLQuery query = session.createSQLQuery("SELECT id, name FROM User WHERE age &gt; :age") .addScalar("id", Hibernate.LONG) .addScalar("name", ...

    J2EE考试题目及答案.docx

    它通过元数据描述对象和数据库之间的映射关系,自动将对象持久化到关系数据库中。 - **作用**: 解决对象和关系数据库之间的不匹配问题,简化了对象的持久化过程,提高了开发效率。 - **优点**: 提供了高级别的抽象,...

Global site tag (gtag.js) - Google Analytics