当我学完这个之后 我仿佛都懂了 = =或许这就是 hibernate的力量吧.
操纵持久化对象(Session)
1.1. 在hibernate中java对象的状态
Hibernate 把对象分为 4 种状态:
¨ 持久化状态,
¨ 临时状态,
¨ 游离状态,
¨ 删除状态.
Session 的特定方法能使对象从一个状态转换到另一个状态
1.2. 临时对象(transient)
¨ 在使用代理主键的情况下, OID 通常为 null
¨ 不处于 Session 的缓存中
¨ 在数据库中没有对应的记录
1.2.1. 删除对象(Removed)
¨ OID 不为 null
¨ 从一个 Session实例的缓存中删除
¨ Session 已经计划将其从数据库删除, Session 在清理缓存时, 会执行 SQL delete 语句, 删除数据库中的对应记录
¨ 一般情况下, 应用程序不该再使用被删除的对象
1.2.2. 持久化对象(也叫”托管”)(Persist)
1.2.3.
¨ OID 不为 null
¨ 位于 Session 缓存中
¨ 持久化对象和数据库中的相关记录对应
¨ Session 在清理缓存时, 会根据持久化对象的属性变化, 来同步更新数据库
¨ 在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象
1.2.4. 游离对象(也叫”脱管”)(Detached)
¨ OID 不为 null
¨ 不再处于 Session 的缓存中
¨ 一般情况需下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录
1.2.5. 对象的状态转换说明(图)
对象的状态转换图
测试hibernate中java对象的状态
程序代码
生命周期
状态
tx = session.beginTransaction();
Customer c = new Customer);
开始生命周期
临时状态
Session.save(c)
处于生命周期中
转变为持久化状态
Long id=c.getId();
c = null;
Customer c2 = (Customer)session.load(Customer.class,id);
tx.commit();
处于生命周期中
处于持久化状态
session.close();
处于生命周期中
转变为游离态
c2.getName();
处于生命周期中
处于游离态
c2 = null;
结束生命周期
结束生命周期
1.2.6. 对象的状态总结
Session缓存存在对应的记录
数据中存在对应的记录
临时态
no
no
持久态
yes
可能有也可能没有
游离态
no
可能有(数据没有删除)也可能没有
1.2.7. 操纵持久化对象的方法(Session中)
1.2.8. save()
Session 的 save() 方法使一个临时对象转变为持久化对象。
¨ Session 的 save() 方法完成以下操作:
把 News 对象加入到 Session 缓存中, 使它进入持久化状态
选用映射文件指定的标识符生成器, 为持久化对象分配唯一的 OID. 在使用代理主键的情况下, setId() 方法为 News 对象设置 OID 使无效的.
计划执行一条 insert 语句,把Customer对象当前的属性值组装到insert语句中
¨ Hibernate 通过持久化对象的 OID 来维持它和数据库相关记录的对应关系. 当 News 对象处于持久化状态时, 不允许程序随意修改它的 ID
@Test
public void save() throws Exception{
Session session = sessionFactory.openSession();
Transaction tc = null;
User user = null;
try {
tc = session.beginTransaction();
user = new User();//临时状态
user.setName("张张");
session.save(user);//持久化状态
tc.commit();
} catch (Exception e) {
tc.rollback();
throw e;
}finally{
session.close();
}
user.setName("王王");//游离状态
System.out.println(user.getName());
}
1.2.9. update()
Session 的 update() 方法使一个游离对象转变为持久化对象, 并且计划执行一条 update 语句。
@Test
public void update() throws Exception{
Session session = sessionFactory.openSession();
Transaction tc = null;
User user = null;
try {
tc = session.beginTransaction();
user = (User) session.get(User.class, 1);
//session.clear();
//session.evict(user);//清楚某一个对象。
user.setName("冯芬1");
//session.update(user);//执