在实际应用中用在,如果想把一个数据库中的记录复制到另一个数据库中,可以用replicate方法,通过ReplicationMode来控制当数据冲突是的行为.
5,delete和evict
evict,从session的缓存中去除当前实例.执行后对象的改变将不再和数据库保持同步.当指定级联风格为evict时,会级联操作关联对象.在用于批量操作的时候,清空缓存,防止内存紧张.
delete,也会从session的缓存中去除当前实例,但flunsh时会执行数据库delete,之后对象就成了临时状态.
delete之后的对象不能调用update和merge方法,但是可以运用saveOrUpdate方法.
可以看出delete比起evict,不仅从session删除,还会从数据库删除.
6,load和get
如果找不到符合条件的纪录,get()方法将返回null.而load()将会报出ObjectNotFoundEcception.如果你使用 load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于 session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理,实际使用数据时才查询二级缓存和数据库.所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。
load()方法可以返回实体的代理类实例,而get返回的可能是实体类,也可能是代理类.get方法如果在session缓存中找到了该id 对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。
8,Session的clear,evict和flush方法
clear()方法清除Session级别缓存中的所有实体(包括各种状态)对象,目的是释放内存.
evict()方法清除Session级别缓存中的指定的实体(包括各种状态)对象.
flush()强制持久化Session缓存中的实体对象,不会从缓存中清除对象.
sessionFactory.getCurrentSession().save(tbo1);
sessionFactory.getCurrentSession().flush();//执行SQL,如果在clear之前不执行flush,tbo1不会被保存到数据库
sessionFactory.getCurrentSession().clear();
sessionFactory.getCurrentSession().save(tbo1);
sessionFactory.getCurrentSession().flush();
sessionFactory.getCurrentSession().evict(tbo1); //如果在evict之前不执行flush,会有异常.