hibernate 实体对象的生命周期主要分为三个状态,Transient(瞬态),Persistent(持久态),Detached(游离态)。
1.Transient(瞬态) 表示该实体对象在内存中是自由的,也就是说和数据库没有任何关系。
//创建一个瞬态对象
User user = new User();
user.setName(userName);
user.setPassword("test");
//user仍是一个瞬态对象
2.Persistent(持久态) 是指该实体对象处于Hibernate框架所管理的状态,也就是说这个实体对象与session对象的实例相关。
处于持久太的实体对象最大的特征是对其所做的任何变更操作都将被Hibernate持久化到数据库层。
//创建一个瞬态对象
User user = new User();
user.setName(userName);
user.setPassword("test");
//user仍是一个瞬态对象
Session session = sessionFactory.openSession();
Tansaction tx = session.beginTansaction();
//此时user仍是一个瞬态对象
session.save(user);
//此时user已变为持久态
tx.commit();
Tansaction tx2 = session.beginTansaction();
user.setPassword("pdw");
tx2.commit();
//虽然在这个事物中并没有调用session的save()方法来保存user对象,但是usr处于持久太,
//所以对user对象所做的任何修改都持久化到数据库中 ---------持久态自动更新
//那么数据库中的密码也变成了pdw
session.close();
另一种方法直接得到持久态的对象:
Session session = sessionFactory.openSession();
Tansaction tx = session.beginTansaction();
User user = (User) session.load(User.class,"key"); ------相当于hql 从DB读出来的 当然是持久态
//user对象已是持久太对象
tx.commit();
session.close();
3.Detached(游离态)是指处于持久态的对象,当不再与他所对应的Session对象向关联时,这个对象就变成游离态了。
//创建一个瞬态对象
User user = new User();
user.setName(userName);
user.setPassword("test");
//user仍是一个瞬态对象
Session session = sessionFactory.openSession();
Tansaction tx = session.beginTansaction();
//此时user仍是一个瞬态对象
session.save(user);
//此时user已变为持久态
tx.commit();
session.close(); clear() evict() 3种变游离态
user对象已经变成游离态
session close完后,对象就变成游离态。
update():
一个PO脱离Session之后,还能保持状态,再进入一个新的Session之后,就恢复状态管理的能力,但此时状态管理需要使用session.update() 新Session也不知道PO在外面做了哪些变化 一定要显式调用s.update() 通知Hibernate,cat对象已经修改了,你必须得赶快制作并发送update的sql了
saveOrUpdate()
public void addMate(Cat cat, Mate mate) { //这里传来两个参数 cat需要cat.setMate()
Session session = ...; cat兴许是new出来传过来的 暂态(save)
Transacton tx = ...; 兴许是DB查出来传过来的 游离态(update)
session.saveOrUpdate(cat);
cat.addMate(mate);
tx.commit();
session.close();
};