原文链 id="session接口">session接口
Session接口是hibernate向应用程序提供的操纵数据库的最主要的接口,提供了保存、更新、删除和加载Java对象的方法。
session具有一个缓存,位于缓存中的对象成为持久化对象,和数据库中的相关记录对应。session能够在某些时间点,按照缓存中对象的变化来执行相关的SQL语句,来同步更新数据库,这一过程称为刷新缓存(flush)。
hibernate把对象分为4种状态,持久化状态,临时状态,游离状态,删除状态。session的特定方法可以使对象进行状态转换
session缓存
session实例没有结束生命周期,且没有清理缓存,则存放在session缓存中的对象也不会结束生命周期,session缓存可以减少访问数据库的频率。
操作session缓存
flush方法
缓存中对象同步到数据库(会插入或更新数据库),使数据库中的状态与缓存中一致
注意:
session在以下情况下会刷新缓存
hibernate在事务提交之前会执行flush()方法,然后再向数据库提交事务
显示调用session.flush()方法
在执行HQL或者QBC查询,会先进行flush()操作,以得到数据表最新的记录
refresh方法
将数据库同步到缓存中(会查询数据库),使缓存中的状态与数据库一致
session.refresh();
clear方法
清理缓存,可以将session中的缓存清除
session.clear();
四种状态的转换
临时状态(Transient)
- 在使用代理主键的情况下,OID通常为null
- 不处于session缓存中
- 在数据库中也没有对应的记录
持久化状态(Persist)
- OID不为null
- 位于session缓存中
- 若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应
- session在flush缓存时,会根据持久化对象的属性变化,来同步数据库
- 在同一个session实例的缓存中,数据库表中每条记录只对应唯一的持久化对象
- 持久化对象的id不可以被修改,因为hibernate是根据id去进行比较的
删除状态(Removed)
- 在数据库中没有和其OID对应的记录
- 不再处于session缓存中
游离状态(Detached)
- OID不为null
- 不再处于session缓存中
- 一般情况下,游离对象是由持久化对象转变过来的,数据库中可能还存在它对应的记录
save方法和persist方法的区别
在调用persist()方法时如果存在id,则会抛出异常,而save方法则可以正常执行
org.hibernate.PersistentObjectException: detached entity passed to persist
get方法和load方法的区别
执行get方法会立即加载对象,执行load方法若不使用该对象,则不会立即查询,而是返回一个代理对象(延时加载)
若数据表中没有对应的记录,get方法返回null,load方法抛出异常
org.hibernate.ObjectNotFoundException: No row with the given identifier exists
load方法可能会抛出懒加载异常
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
注意:在session缓存中不能够有两个相同OID的对象,否则会报异常
public static void testOid(Session session){ User user = (User) session.get(User.class,1); System.out.println(user); User user1 = new User(); user1.setId(1); user1.setName("王五"); session.saveOrUpdate(user1);}org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session
evict方法
从session缓存中将指定的持久化对象移除
hibernate获取原生JDBC连接进行操作
可以使用doWork或者doReturnWork来使用原生JDBC操作数据
session.doWork(new Work() { @Override public void execute(Connection connection) throws SQLException { }});session.doReturningWork(new ReturningWork<Object>() { @Override public Object execute(Connection connection) throws SQLException { return null; }});
由于本身的博客百度没有收录,博客地 />
原文转载:http://www.shaoqun.com/a/632674.html
拍拍购物:https://www.ikjzd.com/w/2205
indiegogo:https://www.ikjzd.com/w/265
原文链id="session接口">session接口Session接口是hibernate向应用程序提供的操纵数据库的最主要的接口,提供了保存、更新、删除和加载Java对象的方法。session具有一个缓存,位于缓存中的对象成为持久化对象,和数据库中的相关记录对应。session能够在某些时间点,按照缓存中对象的变化来执行相关的SQL语句,来同步更新数据库,这一过程称为
blackbird:https://www.ikjzd.com/w/950
焦点科技:https://www.ikjzd.com/w/1831
锦桥纺织网:https://www.ikjzd.com/w/2469
非洲最畅销的中国纸尿裤,国内无人问津!:https://www.ikjzd.com/home/109296
Shopee推出子母账号平台,拟停止邮件发送钱包密码:https://www.ikjzd.com/home/109441
进口货成"洋垃圾"?滞留港区超过3个月将被清退!:https://www.ikjzd.com/home/99370
No comments:
Post a Comment