Hibernate!!Session

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():

原文地址:https://www.cnblogs.com/Mokaffe/p/4151567.html