hibernate的session判断-openSession和getCurrentSession

1.openSession永远打开新的session(打开新的)

2.getCurrentSession,如果当前环境已经有session则用当前session(可能打开新的也可能用以前已经存在的)

代码判断:

@Test
	public void testTeacherSave() {

		Teacher t = new Teacher();

		t.setName("t1");
		t.setTitle("middle");
		t.setBirthDate(new Date());

		Session session = sessionFactory.openSession();

		session.beginTransaction();
		session.save(t);
        session.getTransaction().commit();
		session.close();

		Session session2 = sessionFactory.openSession();
		System.out.println(session == session2);
	}
		

输出:

false

再如:

@Test
	public void testTeacherSave() {

		Teacher t = new Teacher();

		t.setName("t1");
		t.setTitle("middle");
		t.setBirthDate(new Date());

		//Session session = sessionFactory.openSession();
		Session session = sessionFactory.getCurrentSession();

		session.beginTransaction();
		session.save(t);

		Session session2 = sessionFactory.getCurrentSession();

		System.out.println(session == session2);

		session.getTransaction().commit();

		Session session3 = sessionFactory.getCurrentSession();

		System.out.println(session == session3);

	}

输出:

true
false

一个关于openSession和getCurrentSession的分析:

DAO: DATA ACESS OBJECT

如上图所示:userDAO和logDAO都会调用hibernate的sessionsave()方法

问题:这两个操作能否放在同一事务里?

事务:要么这两个操作同时完成,要么一个都不完成。事务的英文:transaction

userDAO和logDAO需要放在同一事务里,所以同时使用opensession()有问题。

事务边界应该放在addUser()里,所以需要用getCurrentSession。

openSession和getCurrentSession不能混用!这两种方法获得的session不是同一个!

时间: 2024-11-03 15:03:51

hibernate的session判断-openSession和getCurrentSession的相关文章

controller中获得hibernate的session方法

问题描述 controller中获得hibernate的session方法 环境:Spring+Hibernate事务由org.springframework.orm.hibernate4.HibernateTransactionManager管理需求是这样的,带有@Transactional注解的Service类中有两个方法:1. check()----用来验证数据2. insert()----用来插入数据我想在controller方法中显式声明一个事物并把check()和insert()放入

Hibernate学习(二)Hibernate中Session之get和load方法的真正区别

最近在学习SHH框架中的Hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入很大.主要是对get方法的说法跟实际运行的结果不一致. 先说一下观点吧: get不支持lazy,load支持lazy: 数据不存在时,get返回null,load则抛出ObjectNotFoundException异常. load方法可以返回实体的代理类实例,而get方法直接读取数据库,所以直接返回

翻译的Hibernate的Session的javadoc

org.hibernateInterface Session All Superinterfaces: Serializable All Known Subinterfaces: EventSource, Session All Known Implementing Classes: SessionImpl public interface Session extends Serializable Java应用程序与Hibernate之间的主要运行时接口.它是抽象了持久化服务概念的核心抽象API

刚学的Hibernate求解session的关闭问题

问题描述 package com.pb.hibernate.util;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtil {private static Session session;private HibernateUtil(){}static{buildSession();}priv

java Hibernate框架Session的保存、更新、删除和查询教程

session的save方法 使一个临时对象变为持久化对象.session的save方法完成以下操作:1.把customer对象加入到缓存中,使他变为持久化对象2.选用映射文件指定的标识符生成器为持久化对象分配唯一的OID.Customer.hbm.xml文件中id元素的子元素指定标识符生成器: <generator><id name="id" column="ID" >    <generator class="increm

一口一口吃掉Hibernate(二)——别被世俗蒙蔽了双眼:Hibernate中Session之get和load方法的真正区别

      最近在学习SHH框架中的Hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入很大.主要是对get方法的说法跟实际运行的结果不一致.       先说一下观点吧: get不支持lazy,load支持lazy: 数据不存在时,get返回null,load则抛出ObjectNotFoundException异常. load方法可以返回实体的代理类实例,而get方法直接

请教:Spring管理Hibernate的session的问题?

问题描述 ssh框架采用了事务控制,用spring来管理hibernate的session,从而导致了很多问题,配置文件如下web.xml<filter><filter-name>hibernateFilter</filter-name><filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class><init-pa

java中hibernate获取Session实例写法

以前的SessionFactory sf = conf.buildSessionFactory();被IDE建议不要继续使用,现在hibernate获取session的方法最好是使用:  代码如下 复制代码 package org.Rudiment.hibernate; import org.Rudiment.hibernate.News; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.

Hibernate的session中的flush

  什么是Hibernate Session刷出(flush)?也许大家对此不够了解,但相信你看完本文一定有很大的收益. 每间隔一段时间,Session会执行一些必需的SQL语句来把内存中的对象的状态同步到JDBC连接中.这个过程被称为Hibernate Session刷出(flush).   默认会在下面的时间点执行:   ◆在某些查询执行之前 ◆在调用org.hibernate.Transaction.commit()的时候 ◆在调用Session.flush()的时候 ◆涉及的SQL语句会