[转帖]Hibernate原理_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3788 | 回复: 0   主题: [转帖]Hibernate原理        下一篇 
yun
注册用户
等级:少校
经验:1082
发帖:83
精华:4
注册:2012-12-17
状态:离线
发送短消息息给yun 加好友    发送短消息息给yun 发消息
发表于: IP:您无权察看 2012-12-21 14:10:44 | [全部帖] [楼主帖] 楼主

Hibernate原理



一、原理:

            1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件

            2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息

            3.通过config.buildSessionFactory();//创建SessionFactory

            4.sessionFactory.openSession();//打开Sesssion

            5.session.beginTransaction();//创建事务Transation

            6.persistent operate持久化操作

            7.session.getTransaction().commit();//提交事务

            8.关闭Session

            9.关闭SesstionFactory 

二、为什么要用:

            1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

            2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作

            3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

            4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,

                从一对一到多对多的各种复杂关系。

三、Hibernate是如何延迟加载?

            1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)

            2. Hibernate3 提供了属性的延迟加载功能

                当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,

                对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

四、Hibernate的查询方式:

Sql、Criteria,object comptosition


            及Hql:

                1、 属性查询

                2、 参数查询、命名参数查询

                3、 关联查询

                4、 分页查询

                5、 统计函数

五、如何优化Hibernate?

            1.使用双向一对多关联,不使用单向一对多

            2.灵活使用单向一对多关联

            3.不用一对一,用多对一取代

            4.配置对象缓存,不使用集合缓存

            5.一对多集合使用Bag,多对多集合使用Set

            6. 继承类使用显式多态

            7. 表字段要少,表关联不要怕多,有二级缓存撑腰

六、load()和get()的区别:

            load加载方法:

                Java代码:

Users user = (Users)session.load(Users.class, userId);
Users user = (Users)session.load(Users.class, userId);


            get加载方法:

                Java代码:

Users user = (Users)session.get(Users.class, userId);
Users user = (Users)session.get(Users.class, userId);


两加载方法区别:

区别1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,

            则返回一个代理对象, 如果后面代码如果调用user对象的某个属性(比如user.getPassword())

            会抛出异常:org.hibernate.ObjectNotFoundException;

区别2:load支持延迟加载,get不支持延迟加载。  

也就是说:

    Java代码

Users user = (Users)session.load(Users.class, userId);
Users user = (Users)session.load(Users.class, userId);


这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。

而:

    Java代码

Users user = (Users)session.get(Users.class, userId);
Users user = (Users)session.get(Users.class, userId);


则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql。

注意:

    Java代码

Users user = (Users)session.load(Users.class, userId);
System.out.println(user.getId());
Users user = (Users)session.load(Users.class, userId);
System.out.println(user.getId());


上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,

该map的key就是userId 的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。

所以不会报任何错。不会执行任何数据库操作。

七、Hibernate有哪几种查询数据的方式:

            a、导航对象图查询

            b、OID查询

c、HQL
d、QBC


            e、本地SQL




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论