hibernate延迟加载

hibernate延迟加载

ID:40555582

大小:91.50 KB

页数:4页

时间:2019-08-04

hibernate延迟加载_第1页
hibernate延迟加载_第2页
hibernate延迟加载_第3页
hibernate延迟加载_第4页
资源描述:

《hibernate延迟加载》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、大概一年半前,我开始了Java之旅。上来就是springMVC+hibernate3+spring的架构让我最头痛的就是hiberante3。后来项目因为数据量大,被迫改成了JDBC。现在回想当初那个hibernate3使用的相当菜了(现在似乎也算刚刚入门),而且对很多hibernate的概念原理懵懵懂懂,用的不好,招来老板对hibernate的一顿质疑。一年半后的今天。当我再次看待hibernate时,除了当年隐隐约约的“委屈”涌上心头,更希望让大家了解hibernate,不要仅仅从应用角度出发。好了,咱们今天来看看hibernate关于延迟加载的原理与实现。主要使用的就是CG

2、Lv1.public void testLazy() {  2.    // 自己弄了一个丑陋的sessionFactory和session,主要是因为自己写的,比较容易控制。  3.    SessionFactory sessionFactory = new SessionFactoryImpl(  4.            User.class);  5.    Session session = sessionFactory.openSession();  6.    User u = 

3、session.load("1");  7.    // 这一句不会触发数据库查询操作,请看图1  8.    assertEquals("1", u.getId());  9.    // 访问的是非主键属性,开始查询数据库,请看图2  10.    assertNotSame("11", u.getName());  11.    session.close();  12.}  图1:通过断点,我们可以看到User对象只是一个代理,并且只有主键id有值  图2:通过断点,我们可以看到原本属于代理对象的User,其targetObject一项已经有值了,表示已经发出select

4、语句从数据库取值了。  好,有了这点感性认识,咱们继续前进。 原理:在hibernate中,如果使用了延迟加载(比如常见的load方法),那么除访问主键以外的其它属性时,就会去访问数据库(假设不考虑hibernate的一级缓存),此时session是不允许被关闭。  先简单看看要操作的对象User1.@Entity  2.public class User{  3.    @Id  4.    private String id;  5.  6.    @Column  7.    private String name;  8.  9.    ........set,get省略

5、  10.}    这些@Entity,@Id,@Column也是我写的一些标注,让大家感觉更贴近hibernate(或jpa)些所做的一些模拟。所有的标注都是空实现,比如说@Id当我们Useru=session.load("1")对象后, ·调用u.getId()时,会立即转入LazyInitializer的intercept()方法,然后按照上面的逻辑,自然是直接返回getId()的值,根本不会与数据库打交道。·当调用u.getName()时,也会先立即转入LazyInitializer的intercept()方法,然后发现"getName()".indexOf("id")>

6、-1==false,于是立即利用已经绑定的session对象去用主键ID往数据库里查询。这也是为什么在hibernate中,如果使用了延迟加载使得一个代理没有被初始化,而你又关闭了session,再次去取除主键外的其它属性时,常常出现sessionclose异常。看到这里,大家是不是觉得所谓的延迟加载并不是那么神秘,而且从数据库I/O操作上来说,会觉得这种设计确实是比较优雅。当然hibernate还有很多很多值得学习和借鉴的特性,下次有时间我再整理整理。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。