Hibernate中的openSession(),getSession() 和 getCurrentSession() 的区别

开发中,使用MyEclipse自动生成的Hibernate DAO类中在对session的获取中,都使用的getSession(MyEclipse8.5之前的版本都是如此)。

首先要说明一下这3个方法:

1、openSession 和 getCurrentSession这两个方法是 Hibernate中的sessionFactory中的方法。要获取session只能通过这两个方法获取。

2、getSession这个方法是使用MyEclipse的Hibernate工具时自动生成的方法。进入方法里查看:

 public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();


if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}


        return session;
    }

很明显,Myeclipse使用的是openSession。所以上述的3个方法,其实也就是openSession和getCurrentSession的区别。

这里简单说明一下openSession 和 getCurrentSession这两个方法的区别。很容易看出来,openSession每次都是创建一个新的session,而getCurrentSession会查看,如果当前上下文中已经有Session,则直接使用原有的,否则会创建一个新的session。

当然这样说并不是很形象。很多人会理解为,后面一个只是前面的略微优化而已,每次都打开新的也不会出错。当然这样理解并没有完全错误,其实这里的Session使用上没有很大的区别,区别是在于使用openSession时,如果涉及到对数据库的数据的修改(增、删、改),在事务提交之后,session必须手动关闭(session.close()),否则会出错,一般是数据已经保存进数据库,但使用Hibernate再次查询数据时并没有显示新的值。而getCurrentSession在事务提交后会自动关闭当前session。

所以,一般推荐使用getCurrentSession,这样需要我们关心的内容就更少,而且更不容易出错。

当然,MyEclipse也不会放着高级的东西不用的,仔细查看上面的代码,发现在openSession之前,session会先从threadLocal中获取,这里的threadLocal就可以类比为getCurrentSession中配置的thread,所以,可以认为MyEclipse是在openSession之前已经实现了从线程中获取上下文的Session,所以直接使用MyEclipse生成的getSession的功能类似getCurrentSession,但是测试后发现,getSession在提交事务之后,并没有自动关闭,仍然需要手动关闭。

为什么MyEclipse不使用getCurrentSession呢?查看生成的DAO类可以发现,MyEclipse生成的是没有和事务相关的操作的,当然在进行save、update、delete操作时必须手动添加事务开始和事务提交,所以这里在提交事务之后必须手动关闭session。而进行数据库查找操作时,openSession是不需要提交事务的。

getCurrentSession则必须要打开一个新的事务,否则会报createQuery is not valid without active transaction错误。

从简化操作的角度,直接使用MyEclipse的方法更为简单,但要记住增删改操作必须手动添加事务,并在操作结束后关闭session。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
配置 Hibernate 的环境需要以下步骤: 1. 下载 Hibernate 的最新版本,并将其解压到本地文件夹。 2. 在项目添加 Hibernate 的 jar 包,包括 Hibernate 的核心包和依赖包。 3. 配置 Hibernate 的配置文件,命名为 hibernate.cfg.xml,并将其放在类路径下。 4. 在配置文件配置数据库连接信息,包括数据库驱动、数据库连接 URL、用户名和密码等。 5. 配置 Hibernate 的映射文件,即将 Java 对象与数据库表进行映射。映射文件的命名为 *.hbm.xml。 6. 在代码使用 Hibernate API 进行数据库的操作,包括增删改查等。 下面是一个简单的示例: 1. 下载 Hibernate 最新版本,并解压到本地文件夹 C:\hibernate。 2. 创建 Java 项目,并在项目添加 Hibernate 的 jar 包。 3. 在项目的 src 目录下创建 hibernate.cfg.xml 文件,并配置数据库连接信息: ```xml <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> </session-factory> </hibernate-configuration> ``` 4. 在项目的 src 目录下创建 User.hbm.xml 文件,并配置用户表的映射信息: ```xml <hibernate-mapping> <class name="com.example.User" table="user"> <id name="id" type="int"> <generator class="native"/> </id> <property name="name" type="string"/> <property name="age" type="int"/> </class> </hibernate-mapping> ``` 5. 在代码使用 Hibernate API 进行数据库操作: ```java Configuration cfg = new Configuration().configure(); SessionFactory sf = cfg.buildSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); User user = new User(); user.setName("Tom"); user.setAge(20); session.save(user); tx.commit(); session.close(); sf.close(); ``` 以上就是配置 Hibernate 的基本步骤。需要注意的是,Hibernate 的配置和使用方法还有很多细节,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值