持久化对象的生命周期有三种:
瞬时态(Transient)
持久态(Persistent)
游离态(Detached)
结合一张图了解一下:
在了解一下几个概念:
1.瞬时态
瞬时态的对象是刚刚用new关键字创建出来的,还没有进入Session,此时的对象没有和数据库中的记录对应。
User user = new User();
user.setName("Lee");
user.setCity("北京");
user.setDepartment("研发部");
user.setPhone("13245689548");
此时的user就是一个瞬时态。
2.持久态
通过Session对象的save(),persist()或者saveOrUpdate()方法进行保存处于瞬时态的对象后,该对象就变为持久态。
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setName("Lee");
user.setCity("北京");
user.setDepartment("研发部");
user.setPhone("13245689548");
session.save(user);
tx.commit();
此时Session中已经存在该对象,并且对应数据库中的一条记录。
注意:
1.session对象还没有失效的时候,对持久化对象的任何修改,只要在修改后调用Session对象的close()方法或者Transaction对象的commit()方法,数据库中对应数据会同时更新。
2. 在调用save()方法后,持久化对象user就变为持久态,但是执行了commit()方法之后,数据库操作才会进行。
3.游离态
处于游离态的持久化对象的标识符属性和数据库表中某条记录的主键对应,但是它脱离了Session的管理,再次对其操作时,Hibernate无法感知其变化。
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setName("Lee");
user.setCity("北京");
user.setDepartment("研发部");
user.setPhone("13245689548");
session.save(user);
tx.commit();
user.setCity("上海");
虽然后来又修改了user对象的city属性,但是是在脱管态修改的,程序结束也不能再影响数据库中数据变化。处于脱管态的对象可以重新调用Session对象的update()方法回到持久态,否则Java虚拟机会在适当时间进行垃圾收集。重新持久化对象的过程如下:
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setName("Lee");
user.setCity("北京");
user.setDepartment("研发部");
user.setPhone("13245689548");
session.save(user);
tx.commit();
user.setCity("上海");
session = sessionFactory.getCurrentSession();
tx = session.beginTransaction();
session.update(user);
tx.commit();
当使用Session对象的delete()方法删除数据后,处于持久态的对象失去和数据库数据的对应关系,此时的持久化对象将在适当时间被Java虚拟机进行垃圾收集。
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, new Integer(1));
session.delete(user);
tx.commit();
总结
不难发现,
处于瞬时态和游离态的对象是不被session管理的,因为hibernate操作的是session,所以数据库中不会改变数据。
处于持久态的对象在Session对象执行close()方法或Transaction对象执行commit()方法时,数据库中数据会同步更新。