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

posted @ 2012-10-29 23:21  xu_huan_chao  阅读(238)  评论(0编辑  收藏  举报