首页 > 代码库 > hibernate 持久化对象的生命周期
hibernate 持久化对象的生命周期
包括三种状态:瞬态(自由态),持久态,托管态(游离态)
自由态
持久化对象的自由态,指的是对象在内存中存在,但是在数据库中并没有数据与其关联。
持久态
持久态指的是持久化对象处于由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); //返回对应数据库中的iduser.setUserPwd("456"); session.getTransaction().commit(); // 持久态 → 游离态System.out.println(user.getId()); // id存在 Session session2 = HibernateUtil.getSessionFactory().getCurrentSsession2.beginTransaction(); user.setUserPwd("789"); session2.update(user); // 游离态 → 持久态session2.getTransaction().commit();
游离态和自由态区别
1. 区别就在于游离态对象可以再次与Session迚行关联而成为持久态对
象。
2. 自由态对象在数据库中没有数据与其对应,但是游离态对象在数据库
中有数据与其对应,只不过当前对象不在Session环境中而已。从对
象的是否有主键值可以做简单
的判断。
三种状态的改变
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操作)