1. SessionFactory(会话工厂)
定义
SessionFactory
是 Hibernate 的一个核心接口,用于创建 Session
对象。它是一个线程安全的工厂类,通常在应用程序启动时创建,并在整个应用程序生命周期中保持不变。
主要职责
-
创建 Session 对象:
SessionFactory
用于创建Session
对象,Session
是 Hibernate 的核心接口,用于执行事务和持久化操作。 -
配置 Hibernate:
SessionFactory
负责加载 Hibernate 配置文件(如hibernate.cfg.xml
或application.properties
),并初始化 Hibernate 环境。 -
管理数据库连接:
SessionFactory
管理数据库连接池,提供高效的数据库连接管理。
示例代码
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// 创建 Configuration 对象并加载配置文件
Configuration configuration = new Configuration().configure();
// 创建 SessionFactory
sessionFactory = configuration.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
2. Session(会话对象)
定义
Session
是 Hibernate 的核心接口,用于执行事务和持久化操作。Session
是线程不安全的,通常在请求处理过程中创建,并在请求结束时关闭。
主要职责
-
执行事务:
Session
提供了事务管理功能,可以开始、提交和回滚事务。 -
持久化操作:
Session
提供了保存、更新、删除和检索对象的方法。 -
管理实体:
Session
管理实体的生命周期,包括加载、保存、更新和删除实体。
示例代码
import org.hibernate.Session;
import org.hibernate.Transaction;
public class UserDaoImpl implements UserDao {
@Override
public User createUser(User user) {
try (Session session = HibernateUtil.getSessionFactory().openSession()) {
Transaction transaction = session.beginTransaction();
session.save(user);
transaction.commit();
return user;
}
}
@Override
public User getUser(Long id) {
try (Session session = HibernateUtil.getSessionFactory().openSession()) {
return session.get(User.class, id);
}
}
}
3. 区别
线程安全性
-
SessionFactory:线程安全的,可以在多个线程之间共享。
-
Session:线程不安全的,通常在请求处理过程中创建,并在请求结束时关闭。
生命周期
-
SessionFactory:通常在应用程序启动时创建,并在整个应用程序生命周期中保持不变。
-
Session:通常在请求处理过程中创建,并在请求结束时关闭。
主要用途
-
SessionFactory:用于创建
Session
对象,管理数据库连接池。 -
Session:用于执行事务和持久化操作,管理实体的生命周期。
4. 联系
-
SessionFactory 是 Session 的工厂类,用于创建 Session 对象。
-
Session 是 SessionFactory 创建的实例,用于执行具体的事务和持久化操作。
-
SessionFactory 管理数据库连接池,而 Session 使用这些连接来执行数据库操作。
5. 总结
-
SessionFactory:
-
线程安全:可以在多个线程之间共享。
-
生命周期:通常在应用程序启动时创建,并在整个应用程序生命周期中保持不变。
-
主要用途:用于创建 Session 对象,管理数据库连接池。
-
-
Session:
-
线程不安全:通常在请求处理过程中创建,并在请求结束时关闭。
-
生命周期:通常在请求处理过程中创建,并在请求结束时关闭。
-
主要用途:用于执行事务和持久化操作,管理实体的生命周期。
-