Hibernate - 会话



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

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

在给定的时间点,实例可能处于以下三种状态之一:

  • 瞬时 - 新的持久类实例,它不与会话关联,在数据库中没有表示,也没有标识符值,Hibernate认为它是瞬时的。

  • 持久化 - 通过将其与会话关联,可以使瞬时实例持久化。持久化实例在数据库中具有表示,具有标识符值,并与会话关联。

  • 脱管 - 关闭 Hibernate 会话后,持久化实例将成为脱管实例。

如果其持久化类是可序列化的,则会话实例是可序列化的。典型的交易应使用以下习惯用法:

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 接口提供了许多方法,但我只列出一些重要的方法,我们将在本教程中使用这些方法。有关与SessionSessionFactory 关联的完整方法列表,您可以查看 Hibernate 文档。

序号 会话方法和描述
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)

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

22

void update(Object object)

使用给定脱管实例的标识符更新持久化实例。

23

void update(String entityName, Object object)

使用给定脱管实例的标识符更新持久化实例。

广告