首先搞清游离对象,临时对象和持久化对象与数据库对象之间的关系:
游离对象与临时对象的相同之处在于,两者都不被Session关联,因此hibernate不会保证它们的属性变化与数据库保持同步。
游离对象与临时对象的区别在于:前者是由持久化对象转变过来的,因此可能在数据库中还存在对应的纪录,而后者在数据库中没有对应的纪录。
持久化对象的特征:
总是被一个Session实例关联。持久化对象与数据库中相关纪录对应。Session在清理缓存时,会根据持久化对象的变化,来同步更新数据库。
因此以下操作针对不同状态的对象。
1.Session.save(),是将临时对象转变为持久对象。在Session.close()后,执行向数据库中insert的操作。
2.Session.load() or Session.get()
返回的对象总是处于持久化状态,可以通过object.set***("String")进行修改。在Session.close()后同步更新数据库。
3.Session.update()
使游离对象转变为持久化对象。由于游离对象在数据库中有对应的纪录,因此可以执行update操作。如果传入的参数为临时对象,临时对象在数据库中没有对应的纪录,执行update操作显然会出现错误。所以Session.update()是用来将游离对象转变为持久化对象。
4.Session.saveOrUpdate()
如果传入的参数为临时对象,则调用save()方法,将其变为持久化对象。
如果传入的参数为游离对象,则调用update()方法,将其变为持久化对象。
5.Session.delete()
用于从数据库中删除与java对象对应的纪录。
如果传入的参数是持久化对象(如用Session.get()出来一个持久对象),Session就计划执行一个delete语句。
如果传入的参数是一个游离对象,先使游离对象被Session关联,使它变为持久化对象,然后计划执行一个delete语句。
临时对象在转化成为持久化对象后,如果再修改了对象的属性,则在Session.close()后会再针对此次修改执行一次update语句。
例如:Customer c = new Customer();
c.setName("tom");
Session.save(c);
c.setName("mario");
Session.close();
先执行insert into customer("","tom");
再执行update customer set name = "mario" where id = "";