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的区别”是关于Hibernate框架中的两个关键操作,它们都是用于在Hibernate中获取数据库会话的。理解它们的区别对于优化数据访问性能和管理事务至关重要。 ...
在Java的Hibernate框架中,`getCurrentSession()` 和 `openSession()` 都是用于获取与数据库交互的Session对象,但它们之间存在显著的区别。理解这些差异对于优化数据访问性能和管理事务至关重要。 首先,`...
标题中的“新Hibernate SessionFactory().getCurrentSession()猫腻”指的是在使用Hibernate ORM框架时,一个常见但不为人熟知的细节,即SessionFactory().getCurrentSession()方法的使用。在深入讲解这个知识点之前...
在Hibernate中,`getCurrentSession()`是SessionFactory类的一个方法,它用于获取当前线程绑定的Session对象。这个方法在处理数据库操作时非常有用,因为每个HTTP请求通常对应一个独立的线程,每个线程都应该有自己...
六、SessionFactory中的openSession()和getCurrentSession()方法 openSession()和getCurrentSession()方法都是用于获取Session对象的方法,但它们有所不同。getCurrentSession创建的Session对象会和当前...
本文主要探讨了几个关于J2EE的重要知识点,包括其四层模型、对象持久化、ORMapping(对象关系映射)、使用Hibernate实现对象持久化的步骤、序列化的作用,以及SessionFactory和Session中的特定方法的区别。...
11. Hibernate中getCurrentSession和openSession的区别是什么? `getCurrentSession`是用于在已有的事务上下文中获取或创建Session,确保与当前事务的一致性。而`openSession`则是直接创建一个新的Session,不考虑...
- 提供`openSession()`和`getCurrentSession()`方法: - `openSession()`每次创建新Session,使用后需关闭。 - `getCurrentSession()`提供线程绑定的Session,方便事务管理。 总结,Hibernate通过O/R Mapping...
在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别专注于依赖注入和对象关系映射。本篇文章将探讨如何在实际开发中结合Spring和Hibernate,利用注解来实现数据访问层(DAO)的操作。注解使得代码更加...
6. Hibernate框架中的SessionFactory类:SessionFactory类提供了两个获得session的方法,分别是openSession()和getCurrentSession()。这两个方法的区别在于,openSession()方法可以在一个线程中使用不同的Session,...
8. getCurrentSession()和openSession()的区别: - getCurrentSession()会检查当前线程是否已有Session,若有则返回,若无则创建。 - openSession()方法总是创建一个新的Session。 - getCurrentSession()在事务...
6. Hibernate 框架中的 SessionFactory 类有两个获得 session 的方法:openSession() 和 getCurrentSession()。如果需要在同一线程中,保证使用同一个 Session 则使用 getCurrentSession(),如果在一个线程中,需要...
在Spring中,我们可以使用`SessionFactory.openSession()`或`SessionFactory.getCurrentSession()`方法获取Session实例。 4. **事务管理**:Spring提供了声明式事务管理,只需在方法上添加@Transactional注解,即可...
框架定义了类和对象的责任,类和对象如何互相协作,以及对象之间的控制线程。这些共有的设计因素由框架预先定义,应用开发人员只须关注于特定的应用系统特有部分。框架着重于设计复用。 在Java EE开发中,使用框架...
在Java Web开发中,Spring和Hibernate是两个非常重要的框架,它们分别处理依赖注入和对象关系映射(ORM)。本文将详细探讨Spring与Hibernate的集成,特别是如何在集成环境中使用和管理`Session`。 首先,Spring作为...
在Spring中,我们可以使用SessionFactory的openSession()或getCurrentSession()方法获取Session实例。 4. **事务管理**: Spring提供PlatformTransactionManager接口,可以用来管理数据库事务。在Hibernate整合中,...
Session session = sessionFactory.getCurrentSession(); SQLQuery query = session.createSQLQuery("SELECT id, name FROM User WHERE age > :age") .addScalar("id", Hibernate.LONG) .addScalar("name", ...
它通过元数据描述对象和数据库之间的映射关系,自动将对象持久化到关系数据库中。 - **作用**: 解决对象和关系数据库之间的不匹配问题,简化了对象的持久化过程,提高了开发效率。 - **优点**: 提供了高级别的抽象,...