休眠生命周期
在这里我们将了解 Hibernate Lifecycle 或者换句话说,我们可以说我们将了解 Hibernate 中实体/对象类的映射实例的生命周期。在 Hibernate 中,我们可以创建实体的新对象并将其存储到数据库中,也可以从数据库中获取实体的现有数据。这些实体与生命周期相连,实体的每个对象都经过生命周期的各个阶段。
Hibernate Lifecycle 主要有四种状态:
- 瞬态
- 持久状态
- 分离状态
- 移除状态
正如上述媒体所描绘的那样,人们可以将它们的绘制方式联系起来,以便在我们的脑海中更好地绘制。现在我们将讨论状态以更好地解释休眠生命周期。如下:
状态 1:瞬态
瞬态是实体对象的第一个状态。当我们使用 new运算符实例化 POJO 类的对象时,该对象处于瞬态状态。此对象不与任何休眠会话连接。由于它没有连接到任何 Hibernate Session,所以这个状态没有连接到任何数据库表。因此,如果我们对 POJO 类的数据进行任何更改,则不会更改数据库表。瞬态对象独立于Hibernate,存在于堆内存中。
有两种布局会发生瞬态,如下所示:
- 当对象由应用程序生成但未连接到任何会话时。
- 对象由关闭的会话生成。
在这里,我们为 Employee 类创建一个新对象。下面是显示 Employee 对象初始化的代码:
//Here, The object arrives in the transient state.
Employee e = new Employee();
e.setId(21);
e.setFirstName("Neha");
e.setMiddleName("Shri");
e.setLastName("Rudra");
状态 2:持久状态
一旦对象与休眠会话连接,对象就会进入持久状态。因此,有两种方法可以将 Transient State 转换为 Persistent State :
- 使用休眠会话,将实体对象保存到数据库表中。
- 使用休眠会话,将实体对象加载到数据库表中。
在这种状态下。每个对象代表数据库表中的一行。因此,如果我们对数据进行任何更改,那么 hibernate 将检测这些更改并在数据库表中进行更改。
以下是为持久状态给出的方法:
- session.persist(e);
- session.save(e);
- session.saveOrUpdate(e);
- session.update(e);
- session.merge(e);
- session.lock(e);
例子:
// Transient State
Employee e = new Employee("Neha Shri Rudra", 21, 180103);
//Persistent State
session.save(e);
状态 3:分离状态
要将对象从持久状态转换为分离状态,我们要么必须关闭会话,要么必须清除其缓存。由于会话在此处关闭或缓存被清除,因此对数据所做的任何更改都不会影响数据库表。每当需要时,分离的对象可以重新连接到新的休眠会话。要将分离的对象重新连接到新的休眠会话,我们将使用以下方法:
- 合并()
- 更新()
- 加载()
- 刷新()
- 节省()
- 更新()
以下是用于分离状态的方法:
- session.detach(e);
- session.evict(e);
- session.clear();
- session.close();
例子
// Transient State
Employee e = new Employee("Neha Shri Rudra", 21, 180103);
// Persitent State
session.save(e);
// Detached State
session.close();
状态 4:移除状态
在休眠生命周期中,它是最后一个状态。在移除状态下,当实体对象从数据库中删除时,实体对象被称为处于移除状态。它是通过调用delete() 操作来完成的。由于实体对象处于已移除状态,因此对数据进行任何更改都不会影响数据库表。
Note: To make a removed entity object we will call session.delete().
例子
// Java Pseudo code to Illustrate Remove State
// Transient State
Employee e = new Employee();
Session s = sessionfactory.openSession();
e.setId(01);
// Persistent State
session.save(e)
// Removed State
session.delete(e);