Java对象在hibernate持久化层的状态:
临时态:不被session关联,在数据库中没有相应的记录
持久态:被session关联,在数据库中有对应的记录
删除态:不被session关联,并且session已经计划从数据库中删除
游离态:不被session关联,在数据库中有对应的记录
Session接口详细用法:
save():
1、 用于保存临时态对象,是得临时对象处于持久态。若用于保存持久态对象是多余的,用于保存游离态对象将在数据库中保存两条完全一样的数据,显然这是不合理的。
2、 最佳实践:应先设置临时对象的状态,再保存临时对象,否则将产生多余的update语句。
3、 持久态对象的主键不允许被随意修改,否则将报异常。最佳实践,在使用代理主键的前提下,无论对象处于4个状态的哪个状态下程序都不应该OID,因此应该将setId( )设置成为private的。
persist():
1、 persist与save的区别是,不会为持久化对象立即分配OID,而是要等到清理内存的时候。
2、 对于persist方法,在事务边界以外执行,该方法不会计划执行insert语句,而对于save方法,无论是在事务边界以外还是在事务内调用它,都立即执行insert语句。
load( )&get():
1、 当数据库中不存在要查询的记录时,load返回ObjectNotFoundException(因为load使用了代理,无论记录存在与否先用代理类构建它的实例),而get返回null。
2、 如果要访问一个对象的各个属性,可以通过get方法获得;
3、 如果只是为了创建对象之间的关联或是删除对象那么可以考虑用load方法,因为load方法默认是使用延迟加载的,构造代理类不访问数据库。
update():
1、 使游离态对象变为持久态对象,并且计划执行一条update语句。
2、 session只有在清理缓存的时候才执行update语句,并且在执行的时候才会把对象的当前属性封装到update语句中,因此程序多次修改对象的属性,在清理缓存的时候只会执行一次update语句。
3、 通过session.update使得游离对象与一个session关联,即使没有修改对象的属性,session在清理缓存的时候也会执行有update()方法计划执行的update语句,可以配置select-before-update语句做判断。
saveOrupdate( ):如果传入的参数是临时对象,则执行save;如果是游离对象则执行update。
merge( ):
1、 引入该方法的背景,用session的update关联一个对象的时候,若缓存中已经存在了同类型并且OID相同的对象,就会报错。
2、 执行merge方法,会将游离态对象的属性赋值到持久态对象中。
delete( ):删除游离态对象或是持久态对象,若删除的是游离态对象,先将对象变为持久态。