1.Hibernate持久化对象的三种状态总结:
1.瞬态:使用new刚创建的并且还未与Hibernate Session关联的对象此时处于瞬态。瞬态对象还不会与数据库之间进行关联
2.持久化:持久化实例在数据库中有对应的记录,持久化实例可以是刚保存的,也可以是刚被加载的
3.脱管:曾经处于持久化状态,随着关联的Session被关闭之后,该对象就变成了脱管状态
2.瞬态->持久化状态
Serializable save(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库
void perssist(Object obj):作用同上
Serializable save(Object obj,Object pk):将obj对象变成持久化状态,保存到数据库时,指定主键值
void perssist(Object obj,Object ph):作用同上
上面的指定主键值的方法用于持久化对象的标识属性类型为assigned类型属性或为复合属性,这就需要手动设置主键值
save()方法和perssist()的区别在于:save()返回该持久化对象的标识属性值,也就是对应记录的主键值;而perssist()没有任何返回值;这样一来save方法就需要立即返回持久化对象的标识属性值,所以执行save方法会立即将持久化对象对应的数据插入到数据库,而perssist方法则不会被立即转换成insert语句
3.根据主键加载持久化实体
1.load():News n = session.load(News.class,pk);
2.get():News n = session.get(News.class,pk);
两个方法的区别在于:load具有延迟加载功能,不会立即访问数据库,而是先返回一个未初始化的代理对象,只有当程序调用该代理对象的某个方法时,Hibernate才会去访问数据库;而get总是立即访问数据库。当试图加载的记录不存在时,load会返回一个未初始化的代理对象,而get直接返回null
4.更新持久化实体
session.flush();//生成一条Update语句,where pk=pkvalue
//如下实例:
News n = session.load(News.class,pk1) ;
n.setTitle("easy hibernate code") ;
session.flush() ;
5.脱管->持久化状态
之前说持久化状态关联对应的session被关闭之后,持久化对象就处于了脱管状态,Hibernate提供了update()、merge()、updateOrSave()来将其重新变成持久化状态,主要用于保存修改。如下
News n = fsession.load(News.class,id) ;
fsession.close() ;
n.setTitle("easy hibernate code") ;
Session Ssession = ...
Ssession.update(n) ;
update():保存程序对持久化对象所做的修改
updateOrSave():如果曾经持久化过,则update,否则save
merge():保存程序对持久化对象所做的修改
merge()和save()方法区别在于:merge()不会持久化给定的对象,如:merge(a);a不会变成持久化状态,只是a修改的操作会被保存而已,a仍然处于脱管状态,因为merge返回值为a对象的副本,该副本处于持久化装填,也就是说merge返回值为与a同类型的类型;而save()返回值为void,会保存修改,也会是a变成持久化状态
6.删除持久化实体
News n = session.load(News.class,pk) ;
//该持久化实例对应的数据记录将从数据库表中删除
session.delete(n) ;