Session提供了基本的crud操作, 事务控制, 一级缓存。
save(): 保存一个新对象到数据库。对应插入数据库中的一条记录, 这里要注意的是,如果该对象的主键配置为identity, increment, forgign, sequence等等,则在save的时候不能指定id,如果id generator配置为assigned,则必须指定id.
update(): 更改一个对象,对应的更改数据库中的一条记录;
delete(): 删除一个已经存在的对象,对应的删除数据库中的一条记录
merge():如果传入的是detached对象, 则加载该对象; 如果传入的对象未保存, 则持久化一个副本并返回该持久化对象, 原来传入的对象依然保持detached状态;
attachDirty(): 如果传入的是瞬时对象, 则save, 如果是detached对象, 则调用update重新和session关联;
get() 和 load() ,他们都通过id加载一个对象,然而区别很大,区别有2:
1: get如果没有找到数据,会返回null,load如果没有找到与id对应的数据,会抛出exception.
2: 他们有延迟加载的区别,get会直接返回那个对象(如果有的话),而load会先返回一个代理对象,只有当真正用这个对象的属性或方法的时候才会去查数据库,关于这一点可以通过debug来发现.我debug后发现load返回的代理对象是这个样子的:
放断点:
debug:
saveOrUpdate(): 同时包括save和update方法,如果传入的是一个新对象(后面提到的瞬时对象)则调用save,如果传入的是一个已经在数据库中存在的对象(后面会提到的托管对象), 则调用update.
beginTransaction(): session通过该函数申明事务开始. 通过transaction.commit()申明事务结束.
session中带有一级缓存, 是内置的, 像这个代码片中,只会查一次数据库,因为第二次会现在session的缓存中寻找.
Book b = dao.findById("000015");
System.out.println(b);
Book b2 = dao.findById("000015");
System.out.println(b2);