Hibernate - Session 会话

会话用于获取与数据库的物理连接。 Session 对象是轻量级的,设计为在每次需要与数据库交互时实例化。 持久对象通过 Session 对象进行保存和检索。

会话对象不应长时间保持打开状态,因为它们通常不是线程安全的,应根据需要创建和销毁它们。 Session 的主要功能是为映射实体类的实例提供、创建、读取和删除操作。

实例在给定时间点可能存在以下三种状态之一 −

  • transient − 持久类的新实例,它不与 Session 关联,并且在数据库中没有表示形式,并且没有标识符值,Hibernate 将其视为瞬态的。

  • persistent − 您可以通过将瞬态实例与 Session 关联来使其持久化。 持久实例在数据库中具有表示形式、标识符值并与 Session 相关联。

  • detached − 一旦我们关闭了 Hibernate Session,持久化的实例就会变成一个分离的实例。

如果 Session 实例的持久类是可序列化的,则它是可序列化的。 一个典型的事务应该使用以下成语 −

Session session = factory.openSession();
Transaction tx = null;

try {
   tx = session.beginTransaction();
   // do some work
   ...
   tx.commit();
}

catch (Exception e) {
   if (tx!=null) tx.rollback();
   e.printStackTrace(); 
} finally {
   session.close();
}

如果 Session 抛出异常,事务必须回滚,会话必须丢弃。


Session 会话接口方法

Session 接口提供了许多方法,但我将仅列出一些重要的方法,我们将在本教程中使用它们。您可以查看 Hibernate 文档以获取与 SessionSessionFactory 关联的方法的完整列表。

序号 Session 会话方法 & 描述
1

Transaction beginTransaction()

开始一个工作单元并返回关联的 Transaction 对象。

2

void cancelQuery()

取消当前查询的执行。

3

void clear()

彻底清除会话。

4

Connection close()

通过释放 JDBC 连接并清理来结束会话。

5

Criteria createCriteria(Class persistentClass)

为给定的实体类或实体类的超类创建一个新的 Criteria 实例。

6

Criteria createCriteria(String entityName)

为给定的实体名称创建一个新的 Criteria 实例。

7

Serializable getIdentifier(Object object)

返回与此会话关联的给定实体的标识符值。

8

Query createFilter(Object collection, String queryString)

为给定的集合和过滤字符串创建一个新的 Query 实例。

9

Query createQuery(String queryString)

为给定的 HQL 查询字符串创建一个新的 Query 实例。

10

SQLQuery createSQLQuery(String queryString)

为给定的 SQL 查询字符串创建一个新的 SQLQuery 实例。

11

void delete(Object object)

从数据存储中删除一个持久实例。

12

void delete(String entityName, Object object)

从数据存储中删除一个持久实例。

13

Session get(String entityName, Serializable id)

返回具有给定标识符的给定命名实体的持久实例,如果没有这样的持久实例,则返回 null。

14

SessionFactory getSessionFactory()

获取创建此会话的会话工厂。

15

void refresh(Object object)

从底层数据库重新读取给定实例的状态。

16

Transaction getTransaction()

获取与此会话关联的 Transaction 实例。

17

boolean isConnected()

检查会话当前是否已连接。

18

boolean isDirty()

此会话是否包含任何必须与数据库同步的更改?

19

boolean isOpen()

检查会话是否仍然打开。

20

Serializable save(Object object)

持久化给定的瞬态实例,首先分配一个生成的标识符。

21

void saveOrUpdate(Object object)

保存(对象)或更新(对象)给定的实例。

22

void update(Object object)

使用给定分离实例的标识符更新持久实例。

23

void update(String entityName, Object object)

使用给定分离实例的标识符更新持久实例。