在比较openSession和getCurrentSession这两个方法之前,我们先认识一下这两个方法。
在进行配置信息管理时,我们一般进行一下简单步骤:
Configuration cfg = new Configuration(); // 获得配置信息对象
SessionFactory sf = cfg.configure().buildSessionFactory(); //解析并建立Session工厂
1. Session session = sf.getCurrentSession(); // 获得Session
2. Session session = sf.openSession(); // 打开Session
对于上述的两个方法,有以下区别:
1. openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。
2. getCurrentSession ,从字面上可以看得出来,是获取当前上下文一个session对象,当第一次使用此方法时,会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一,简单而言,getCurrentSession 就是:如果有已经使用的,用旧的,如果没有,建新的。
注意 :在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务(即是使用一个数据库的情况),所以在一般情况下比较少使用openSession或者说openSession是比较老旧的一套接口了;
对于getCurrentSession 来说,有以下一些特点:
1.用途,界定事务边界
2.事务提交会自动close,不需要像openSession一样自己调用close方法关闭session
3.上下文配置(即在hibernate.cfg.xml)中,需要配置:
<property name="current_session_context_class">thread</property>
(需要注意,这里的current_session_context_class属性有几个属性值:jta 、 thread 常用 , custom、managed 少用 )
a).thread使用connection 单数据库连接管理事务
b).jta (java transaction api) Java 分布式事务管理 (多数据库访问),jta 由中间件提供(JBoss WebLogic 等, 但是tomcat 不支持)
下面是openSession 和 getCurrentSession 简单实例的区别 :
1.openSession方式 :
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.hibernate.model.Student; // 注意包路径
public class StudentTest {
public static void main(String[] args) {
Student s = new Student();
s.setId(1);
s.setName("s1");
s.setAge(1);
Configuration cfg = new Configuration(); // 获得配置信息对象
SessionFactory sf = cfg.configure().buildSessionFactory(); //解析并建立Session工厂
Session session = sessionFactory.openSession(); // 打开Session
session.beginTransaction(); // 看成一个事务,进行操作
session.save(s); // 会找到 Student 这个类,寻找set方法
session.getTransaction().commit(); // 提交对数据的操作
session.close();
sf.close();
}
}
2.getCurrentSession方式 :
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.hibernate.model.Student; // 注意包路径
public class StudentTest {
public static void main(String[] args) {
Student s = new Student();
s.setId(1);
s.setName("s1");
s.setAge(1);
Configuration cfg = new Configuration(); // 获得配置信息对象
SessionFactory sf = cfg.configure().buildSessionFactory(); //解析并建立Session工厂
Session session = sessionFactory.getCurrentSession(); // 打开Session
session.beginTransaction(); // 看成一个事务,进行操作
session.save(s); // 会找到 Student 这个类,寻找set方法
session.getTransaction().commit(); // 提交对数据的操作
sf.close();
}
}
Student 类代码 :
package com.hibernate.model;
public class Student {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
相关推荐
在Java的Hibernate框架中,`getCurrentSession()` 和 `openSession()` 都是用于获取与数据库交互的Session对象,但它们之间存在显著的区别。理解这些差异对于优化数据访问性能和管理事务至关重要。 首先,`...
<property name="driverClass" value="${driverClass}"></property> <property name="user" value="${username}"></property> <property name="password" value="${password}"></property> ...
博文链接:https://shaqiang32.iteye.com/blog/201918
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">...
2. **为什么使用getCurrentSession()**:与直接调用`openSession()`创建新的Session相比,`getCurrentSession()`有以下优势: - 它能够自动管理Session的生命周期,比如在请求结束时关闭Session,避免资源泄露。 -...
当我们调用SessionFactory().getCurrentSession()时,Hibernate会为我们提供一个已存在的或者新创建的Session实例,这个行为与直接调用SessionFactory.openSession()有所不同。`getCurrentSession()`方法旨在支持...
List<User> users = new ArrayList<>(); for (Object[] result : rawResults) { User user = new User(); user.setId((Long) result[0]); user.setName((String) result[1]); users.add(user); } return ...
在XML配置文件中,我们可以通过`<id>`标签下的`<generator>`子标签来指定主键生成策略,如`<generator class="native"></generator>`。而在注解方式下,我们可以在`@Id`下添加`@GeneratedValue`,同样可以指定`...
<span th:if="${error}" th:text="${error}"></span> </form> ``` 在上述流程中,`hibernate_0200`可能包含了实现上述功能的源代码、配置文件和其他相关资源。通过分析这些文件,初学者可以更好地了解如何将...
<property name="connection.url">jdbc:mysql://localhost:3306/mydb</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.username">user</...
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testdb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password...
2. **导入映射配置文件**:这部分通过`<mapping>`标签指定Hibernate所使用的映射文件的位置。映射文件用于描述Java实体类与数据库表之间的映射关系。 3. **其他配置**:包括显示SQL语句、格式化SQL输出、自动建表等...
method=showUser&userId=<%=user.getUserId()%>">修改</a></td> <td><a href="/myweb/user/userAction.do?method=removeUser&id=<%=user.getId()%>">删除</a></td> ``` - **解释**:上述代码展示了如何通过链接发起...
- `<property name="hibernate.connection.url">`:指定数据库连接URL。 - `<property name="hibernate.connection.username">`:指定数据库用户名。 - `<property name="hibernate.connection.password">`:指定...
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0....
- 使用`<class>`标签定义类的基本信息,使用`<id>`标签定义主键字段,使用`<property>`标签定义其他属性字段。 **注解映射示例:** - 通过在Java类上使用`@Entity`、`@Table`、`@Id`等注解来实现映射。 - `@Entity`...
`openSession()`和`getCurrentSession()`用于获取Session实例,`save()`, `saveOrUpdate()`, `delete()`分别用于对象的持久化操作。`refresh()`刷新对象状态,`clear()`清除Session中的所有对象,`evict()`则用于从...
编程式事务处理是手动管理事务边界,而OpenSession/GetCurrentSession模式则是在操作数据库时自动开启和关闭Session。这两者在事务管理和性能上有不同的考量。学习者将了解到何时选择哪种方式,以及它们在Spring中...