在一个Hibernate应用中,Java对象可以处于以下三个状态之一:
1.临时状态(Transient)【瞬时状态】
处于这个状态的对象还被没有纳入Hibernate的缓存管理体系,跟任何session都不关联,在数据库中也没有对应的记录。
2.持久化状态(Persistent)
处于这个状态的对象位于Session的缓存中,并且和数据库中的一条数据记录相对应。
3.游离状态(Detached)【脱管状态】
处于这个状态的对象不再位于Session的缓存中,它与临时对象的最大区别在于,游离对象在数据库中还可能存在一条与它对应的记录。
session中的API
1.save()方法
Hibernate认为通过new产生的持久化类实例为瞬时对象,save提供了将瞬时对象转化为持久化对象的手段
功能:使瞬时对象持久化
例:
Student stu = new Student();
stu.setName("Ken");
sesion.save(stu);
2.update()
功能:使脱管对象持久化
例:
Student stu = (Student)session1.load(Student.class,2);
stu.setName="tom";
session1.flush();//修改持久化对象 ,可以通过这种方式直接修改
session1.close();//对象脱管
stu.setName="Keaven";
session2.update(stu);//脱管对象持久化,必须为脱管,否则抛出异常
3.saveOrUpdate()
功能:既能保存瞬时对象又可以更新、重新关联脱管对象
该方法同时具备save()和update()方法的功能,并具有自动检测参数类型的功能
若参数为瞬时对象,执行save
若参数为脱管对象,执行update
例:
Cat cat1 = (Cat)session.load(Cat.class,5);
Cat cat2 = new Cat();
session.saveOrUpdate(cat1);
session.saveOrUpdate(cat2);
4.delete()
功能:从数据库中移除与对象相应的记录
移除脱管对象或持久化对象
5.load()和get()
功能:根据某个对象的持久化标识符来获取该对象
A.如果找不到符合条件的纪录
get()方法将返回null.而load()将会抛出ObjectNotFoundEcception.
B.load()方法可以返回实体的代理类实例,而get()永远只返回实体类.
C.load()方法可以充分利用二级缓存和内部缓存的现有数据,而get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用SQL完成查找.
例:
Cat cat = (Cat)session.load(Cat.class,CatID);
注意:在不确定数据库中是否有匹配记录的情况下,一般使用get
6.flush()
自动将持久化对象的数据与数据库同步
7.clase()
功能:清空session缓存,缓存中的所有持久化对象变为脱管对象,若在应用程序中没有变量引用这些对象,将被垃圾回收。
8.evict()
功能:从缓存中删除一个持久化对象,使其变为脱管对象,可以提高性能
大多数情况下不推荐使用