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 文档以获取与 Session 和 SessionFactory 关联的方法的完整列表。
| 序号 | 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) 使用给定分离实例的标识符更新持久实例。 |

