Hibernate Session 操作数据库的方法详解
在讲Session 方法之前我们必须弄清在Hibernate 中一个实例对象的三种状态。
① 自由状态(transisent)又叫瞬时状态:对象被实例化但没有给对象的OID 属性赋值。
User user = new User(); 这时的user 处于自由状态。
② 游离状态(detached)又叫托管状态:实例化对象的OID 属性也被赋值。
user.setId(1); 这时的user 处于游离状态。
③ 持久化状态(persistent):仅与一个Session 相关联。
session.save(user); 这时user 处于持久化状态。
粗略地可以这样认为:当一个实例对象的OID 被赋值,并且在数据库中叶有这样一条记录存在,那么这个对象就是持久对象;当一个实例对象的OID 也被赋值,但在数据库中没有这样的一条记录时,该对象就处于游离状态。
现在我们来讲当Session 中的方法来操作游离对象和持久对象有什么区别:
㈠ 操作游离对象
User user = new User();
user.setId(1);
user.setName("Joe");
save() 方法:
session.save(user);
这时Hibernate 会执行一条SQLINSERT 语句。当数据库存在这条记录时,会抛出异常。
saveOrUpdate()方法:
session.saveOrUpdate(user);
当数据库中没有这条有记录时,Hibernate 会执行一条SQLINSERT 语句。当数据库中有这条记录时,Hibernate的脏检查机制会自动检查游离对象的属性值与数据库中对应的字段值是否一样。如果一样就什么也不做;如果不一样就执行SQLUPDTE 语句。
比如:这时的user 对象的属性 name = "Joe",数据表 t_user 的字段 name = "Joe",Hibernate 什么也不会做,当数据表 t_user 的字段 name = "JOJ" ,那么Hibernate 就会执行一条SQLUPDATE 语句。
persist() 方法:
这个方法基本和save() 方法的用法一样。
update() 方法:
session.update(user);
当数据库中存在这条记录时,Hibernate 总会执行一条SQLUPDATE 语句;当数据库中不存这条记录时,就会抛出异常。
delete() 方法:
session.delete(user);
当数据库中存在这条记录时,Hibernate 总会执行一条SQLDELETE 语句;当数据库中不存这条记录时,就会抛出异常。
merge() 方法:
这个方法基本和saveOrUpdate() 方法的用法相似。
lock() 方法:
session.lock(user,LockMode.NONE); //必须在后面有一条setter 方法,不然Hibernate 什么也不会做。
user.setAge(29);
当数据库中存在这条记录时,Hibernate 总会执行一条SQLUPDATE 语句;当数据库中不存这条记录时,就会抛出异常。
replicate() 方法:
session.replicate(user,ReplicationMode.EXCEPTION);
这个方法基本和save() 方法和 persist() 方法的用法相似。
㈡ 操作持久状态对象
load() 方法:通过OID 从数据库中抓取数据,并把数据加载到一个新实例对象上。
User user =(User) session.load(User.class, 1); // 此时的 user 处于持久状态
调用这个方法时,当数据库中存在这条记录时,Hibernate 会执行一条 SQLSELECT 语句;当数据库中没有这条记录时,会抛出异常。
get() 方法:通过OID 从数据库中抓取数据,并把数据加载到一个新实例对象上。
User user = (User) session.get(User.class, 1); // 此时的 user 处于持久状态
调用这个方法时,当数据库中存在这条记录时,Hibernate 会执行一条 SQLSELECT 语句;当数据库中没有这条记录时,user = null。
save() 方法:
User user = (User) session.load(User.class, 1);
user.setName("JOE");
session.save(user);
Hibernate的脏检查机制会自动检查对象的属性(name)值与数据库中对应的字段(name)值是否一样。如果一样就什么也不做;如果不一样就执行SQLUPDTE 语句。
saveOrUpdate()方法:这时的saveOrUpdate() 和 save() 方法用法一样。
persist() 方法:与 save() 方法一样。
update() 方法:与 save() 方法一样。
delete() 方法:
session.delete(user);
Hibernate 执行一条 SQLDELETE 语句,这时 user 变为游离状态。
merge() 方法:与 update() 方法一样。
lock() 方法:与 update() 方法一样。
session.lock(user,LockMode.NONE); //此时不必在后面有一条setter 方法。
replicate() 方法:与 update() 方法一样。
session.replicate(user,ReplicationMode.EXCEPTION);
flush() 方法:与 update() 方法一样。
User user = (User) session.load(User.class, 1);
user.setName("JOE");
session.flush();
refresh() 方法:
User user = (User) session.get(User.class, 1);
user.setName("JOE");
session.flush();
session.refresh(user);
########################################################################################################
clear() 方法:清空Session 缓存
session.clear();
evcit() 方法:把持久对象从Session 缓存中移除。
session.evcit(user);