Hibernate更新数据

public boolean update(Livestock ls) throws HibernateException {


Transaction tx = null;
try {
Session session = this.getSession();
tx = session.beginTransaction();
Livestock d = new Livestock();
session.clear();//此方法不调用有可能出错,a different object with the same identifier value was already associated with the session:
session. load(d, ls.getEarTag());
d.setType(ls.getType());
d.setWeight(ls.getWeight());
d.setSupplyBill(ls.getSupplyBill());
d.setWareStatus(ls.getWareStatus());
d.setCarcasses(ls.getCarcasses());
session. update(d);
session.flush();
tx.commit();
return true;
} catch (HibernateException e) {
e.printStackTrace();
if (tx != null)
tx.rollback();
return false;
} finally {
this.sessionClose();
}

}

Session.load执行过程:

在执行session.load时,Hibernate首先从当前session的一级缓存中获取id对应的值,如果获取不到,将根据该对象是否配置了二级缓存来做相应的处理,若配置了二级缓存,则从二级缓存中获取id对应的值,若仍然获取不到则还需要根据是否配置了延迟加载来决定如何执行,若未配置延迟加载则从数据库中直接获取,在从数据库获取到数据的情况下,Hibernate会相应的填充一级缓存和二级缓存,如配置了延迟加载则直接返回一个代理类,只有在触发代理类的调用时才进行数据库查询的操作。

一级缓存----->二级缓存------>延迟加载-------->数据库

因此在session一直打开的情况下,要注意在适当的时候对一级缓存进行刷新操作,通常是在该对象具有单向关联维护的时候,在Hibernate中可以使用象session.clear、session.evict的方式来强制刷新一级缓存。

二级缓存则在数据发生任何变化(新增、更新、删除)的情况下都会自动的被更新。



你可能感兴趣的:(Hibernate,数据库,session,object,null)