您的位置:首页 > 其它

Hibernate学习小结

2016-05-28 00:00 344 查看
1. get()和load()方法的区别 ?

get()和load()方法:从数据库中取得都是持久化对象,即已经记载在一级缓存session中,但是如果调用session.close(),就

会导致get()和load()的对象变为游离态, 即它们不在session的缓存中.

get()方法: 调用这个方法,hibernate回去确认ID(主键标示符-OID)在数据库中是否存在, 首先会去session中查找,也就是

一级缓存中去查找! 如果没有, 再去二级缓存(SessionFactory缓存,也称应用缓存)中查找, 如果再次没有,就去数据库中查

找, 如果接连查找都没有, 就会返回一个NULL.

load()方法: 调用这个方法,hibernate就会认为咱们所查找的ID一定存在! 首先回去session中查找, 如果没有找到,

hibernate会根据xxx.hbm.xml文件中的<class name=”类名” lazy=”true/false”>lazy的属性值判断是否使用延迟加载,

如果是true, 就返回该对象的代理, 如果在session中没找到, 再去二级缓存SessionFactory中查找, 如果二级缓存没找到,

再去数据库中去查找, 如果还是没有, 就会抱ObjectNotFoundException异常.

load()方法要和get()方法一样效果, 就需修改xxx.hbm.xml文件中的<class name=”类名” lazy=”false”>就可.

2. Hibernate中java对象的三种状态





3. Hibernate中java对象的三种状态之间的转化





其中, delete()方法是唯一使得持久状态或游离态变为临时状态的方法.

4. update() 、saveOrUpdate()以及merge()的区别 ?

01. update(): 直接更新数据库中数据, 只有一条SQL语句, 无论数据库是否存在该数据, 并且会把游离状态的对象转换为持久化状态!

02. saveOrUpdate(): ① 数据库存在数据时, 先查询, 后修改! 两条SQL语句; ② 数据库不存在该数据时, 先查询, 后新增! 两条SQL语句.

上述两种情况主要是通过主键标示符(OID)来判断是调用save()还是update(), 当对象是临时状态时,执行save();

当对象时游离状态的时候, 执行update()方法;

03. merge(): ① 数据库存在数据时, 先查询, 后修改! 两条SQL语句; ② 数据库不存在该数据时, 先查询, 后新增! 两条SQL语句.

当对象是临时状态的时候, 将对象复制一份到session的缓存中, 而原有传进去的对象仍然是临时状态, 执行save(), 返回

session缓存中的对象引用, 对象变为持久状态, 可以通过一个变量接收该返回值, 就可以获得该持久状态对象.

5. 脏检查和缓存清理

脏对象: 与之前session中存在的快照进行比对, 发现对象的属性发生变化时, 那么该比对的对象就成为脏对象.

脏检查: 就是获得对象与快照比对的过程.

脏检查何时发生: ①当清理缓存(调用session的flush()方法)时, Hibernate会对session中持久状态的对象进行检测, 判断对象的数据是否发生

改变, 即这是进行脏检查.

②当调用commit()方法时, 其会默认调用flush()方法, 这过程中也会发生脏检查.





6. Hibernate中通过query接口方法查询中list() 和iterator()方法的区别 ?

list()查询所有对象, 只有一条sql查询语句

iterator()方法查询是所有对象的OID, 当要遍历查询的结果时, 如果缓存session中存在数据库对应的持久化对象时, 整个查询只有一条sql语句, 遍历结果的过程中不会出现sql语句, 当缓存中不存在时,会执行n+1条sql语句, n代表OID的个数, 其中第一条sql语句查的是所有对象的OID(主键标示符).

7. String、StringBuffer和StringBuilder的区别 ?

从执行速度上来说, StringBuilder是最快的,;String是最慢的,每次都是新开辟一个空间; StringBuffer居中.

从线程安全角度来说, StringBuffer是线程不安全的;StringBuilder是线程不安全的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: