hibernate 持久化对象的生命周期

时间:2022-08-14 09:00:48

包括三种状态:瞬态(*态),持久态,托管态(游离态)

*态

持久化对象的*态,指的是对象在内存中存在,但是在数据库中并没有数据与其关联。

持久态

持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中。

游离态

处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态。也就是说Session实例是持久态对象的宿主环境,一旦宿主环境失效,那么持久态对象迚入游离状态。

 

session.beginTransaction(); 
User user = new User(); // *态
user.setUserName("James"); 
user.setUserPwd("123"); 
System.out.println(user.getId()); //id不存在
Integer id = (Integer) session.save(user); //返回对应数据库中的id
user.setUserPwd("456"); 
session.getTransaction().commit(); // 持久态 → 游离态
System.out.println(user.getId()); // id存在 

Session session2 = HibernateUtil.getSessionFactory().getCurrentS
session2.beginTransaction(); 
user.setUserPwd("789"); 
session2.update(user); // 游离态 → 持久态
session2.getTransaction().commit();

游离态和*态区别

1. 区别就在于游离态对象可以再次与Session迚行关联而成为持久态对
象。

2. *态对象在数据库中没有数据与其对应,但是游离态对象在数据库
中有数据与其对应,只不过当前对象不在Session环境中而已。从对
象的是否有主键值可以做简单的判断。

            三种状态的改变

hibernate 持久化对象的生命周期

load和get方法

• get和load方法都是利用对象的主键值获取相应的对象,并可以使对象处于持久状态。

• load方法获取对象时不会立即执行查询操作,而是在第一次使用对象是再去执行查询操作。如果查询的对象在数据库中不存在,load方法返回值不会为null,在第一次使用时抛出org.hibernate.ObjectNotFoundException异常。

• 使用get方法获取对象时会立即执行查询操作,并且对象在数据库中不存在时返回null值。

save和persist方法

• save和persist方法都是将持久化对象保存到数据库中
• sava方法成功执行后,返回持久化对象的ID
• persist方法成功执行后,不会返回持久化对象的ID,persist方法是JPA中推荐使用的方法

save和update方法

• save方法是将*态的对象进行保存。
• update方法是将游离态的对象进行保存。

update和saveOrUpdate方法

• 如果一个对象是游离态或持久态,对其执行update方法后会将对象的修改同步到数据库中,如果该对象是*态,则执行update方法是没有作用的。

• 在执行saveOrUpdate方法时该方法会自动判断对象的状态,如果为*态则执行save操作,如果为游离态或持久态则执行update操作。

update和merge方法

• 如果持久化对象在数据库中存在,使用merge操作时迚行同步操作。如果对象在数据库不存在,merge对象则迚行保存操作。

• 如果对象是游离状态,经过update操作后,对象转换为持久态。但是经过merge操作后,对象状态依然是游离态。

saveOrUpdate和merge方法

saveOrUpdate方法和merge方法的区别在于如果session中存在两个主键值相同的对象,进行saveOrUpdate操作时会有异常抛出。这时必须使用merge迚行操作。

clear方法和flush方法

clear方法是将Session中对象全部清除,当前在Session中的对象由持久态转换为游离态。flush方法则是将持久态对象的更改同步到数据库中。(在事务提交之前进行flush操作)