hibernate对象状态

session 的几个主要方法: 
1,save方法和persist方法的区别;
2,delete,删除对象
3,update,更新对象,如果数据库中没有记录,会出现异常。
4,get,根据ID查,会立刻访问数据库。
5,load,根据ID查,(返回的是代理,不会立即访问数据库)
6,saveOrUpdate,merge(根据id和version的值来确定是save还是update),调用merge你的对象还是脱管的。
7,lock(把对象变成持久对象,但不会同步对象的状态)
8,flush 把缓存中的数据刷新到数据库。

Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。
其区别在于:
1,如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
2,Load方法可返回实体的代理类实例,而get方法永远直接返回实体类。
3, load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据库读取。 


补充:load的懒加载的理解,见后面部分。

对于和ibernate而言,对象有三种状态:瞬时对象,持久对象,游离对象或脱管对象
1.瞬时(transient):数据库中没有数据与之对应,超过作用域会被jvm的垃圾收集器回收,一般是new出来且与session没有关联的对象
2.持久(persistent):数据库中有数据与之对应,当前session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库( hibernate能检测到 )。
3,脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;脱管对象状态发生改变,hibernate不能检测到。
 
Java代码 
  1. Session session = HibernateUtil.getSession();  
  2.       Transaction tx = session.beginTransaction();  
  3.       session.save(user);  
  4.       user.setUserName("new name");  
  5.       tx.commit();  
  6.       System.out.println("end");  
 
上例中,在session.save(user)执行后,user就是持久对象(数据库中有记录了同时和session关联,接受hibernate的管理),所以下一句user修改自己的属性,它的动作被hibernate检测到,在事务提交时能够同步更新到数据库中去。在执行过程中,hibernate执行两个动作:
Hibernate: insert into user (userName, birthday, id) values (?, ?, ?)
Hibernate: update user set userName=?, birthday=? where id=?
 
既然如此,对象的更新能够自动被监测执行,那么session对象的update方法岂不是英雄无用武之地了?其实不然,当一个对象处于游离状态时,可以调用session的update方法,手动地把信息更新到数据库中去。

再者,有时候你接受传过来的一个对象,你有时候并不知道该对象是瞬时的还是脱管的,那么该怎么办呢?这是就可以调用session对象的saveOrUpdate方法。hibernate内部可以根据对象的id的值来判断对象的状态,id无值则为瞬时对象,有值说明是脱管对象,从而执行相应的动作。调用了saveOrUpdate方法,对象的状态变为持久,而使用merge方法(功能和saveOrUpdate差不多),对象的状态变为脱管。

对象的状态转化图如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值