Session接口管理一个数据库的任务单元
session的用法如下:
Configuration cfg = new AnnotationConfiguration().configure(); SessionFactory sf = cfg.buildSessionFactory(); Session session = sf.openSession(); //session开始事务 session.beginTransaction(); session.save(t); //save方法 //获得事务,并提交 session.getTransaction().commit(); session.close(); sf.close();
方法(CRUD):
- save()
- delete()
- update()
- saveOrUpdate()
- load()
- get()
delete():
在hibernate中,删除数据和添加、查询数据有所不同,因为要删除的对象并不在Session的管理之中,通过Session并不能对其进行删除操作,所以需要将要删除的对象转换为持久状态(persistent),使其处于Session的管理之内,然后再通过delete()方法进行删除。(必须要有ID)
查询数据
Session接口提供了两个加载数据的方法,get() 和 load() 方法,有区别:
get()返回实际对象,总会发出SQL语句。
load()返回对象的代理,只有在被调用的时候,hibernate才会发出SQL语句去查询对象。
(新知道的名词:动态代理)
load():
public Object load ( Class entityClass , Serializable id) throws HibernateException
entityClass : 持久化对象的类,
id : 标识
update():
- 用来更新detached对象,更新完成后转为persistent对象
- 更新transient对象会报错
- 更新自己设定id 的 transient对象可以(数据库有对应的记录)
- persistent状态的对象只要设定不同字段就会发生更新
- 更新部分更改的字段
a)映射文件的xml设定property 标签的 update属性, annotation设定@Column的 updatable属性,不过这种方法很少用,不灵活
b)使用配置文件的xml中class里面的dynamic-update 属性, JPA1.0 Annotation没有对应的属性,hibernate扩展?(同一个Session可以,跨Session不可以,若想跨Session,在Java代码中可以加入一个merge()方法)
c)使用HQL(EJBQL) (建议)
saveOrUpdate():
clear():
- 无论是load 还是 get ,都会首先查找缓存 (一级缓存) , 如果没有,才会去数据库查找 , 调用 clear()方法强制清楚 Session缓存
flush():