Java框架之hibernate(3)

来源:互联网 发布:heroku绑定域名 编辑:程序博客网 时间:2024/06/16 12:03

hibernate官方文档:http://docs.jboss.org/hibernate/core/3.6/reference/zh-CN/html_single/

一、hibernate的5种查询方式总结:

           Hibernate 的检索方式主要有 5 种,分别为导航对象图检索方式、OID 检索方式、HQL 检索方式、QBC 检索方式和 SQL 检索方式


1、对象图导航检索:

  

 2、OID 检索方式:

  

 3、HQL 检索:  

 

  ①、基本语法:

   


  ②、排序:

  

  ③、条件:

             问号占位符

    

             命名占位符

  

           
  ④、分页:

   

  ⑤、聚合:

      

  ⑥、投影:

      

 hql多表:

                  

    

 4、QBC检索:

   

   ①、基本语法:

   

   ②、排序:
   

   ③、条件:
   
           
   ④、分页:

   

   ⑤、聚合:

   

 离线Criteria对象:

   不需要session,可以"凭空"获得的Criteria对象.

  用法:

   

       api:

                   

  5、sql检索:

          

  6.使用总结:

              根据id查询=>OID查询
         查询已有对象的关联属性=>对象视图导航
         单表条件查询=>Criteria
         简单多表 => HQL(不推荐)
         复杂多表=> SQL

 

二、hibernate查询优化(hibernate查询策略):

     

         1、对象(类)级别:涉及方法:load方法

                         

                        

                    原理:懒加载策略时,load方法不执行查询,会先返回一个代理对象.代理对象中会封装当前的session对象.当我们访问代理对  象的属性时,代理对象会根据session查询数据库初始化对象中的属性

                 .

             懒加载策略生成代理时,使用的代理技术是第三方代理技术=>CGLIB代理该代理生成的代理对象是被代理对象的子类.被final 修饰的类不能被CGLib代理.

       2、关联级别:

              ①、  集合查询: 一对多|多对多:

                               

                ②、关联属性:多对一:

                               

        3、结论:懒加载效率高.全部使用默认值即可.


三、注意问题:

            1、no-session问题:

                         

                          注意:代理对象的初始化不能放在session关闭之后.不然,会抛出异常:no-session

                        

          2、关于实体类唯一标识问题:

                如果我们希望使用 Hibernate 提供的所有特性,那么所有的持久化实体(persistent entity)类(这里也包括一些次要依赖  类)都需要一个唯一的标识符属性

          3、批量插入问题:

                   这段程序大概运行到 50,000 条记录左右会失败并抛出内存溢出异常(OutOfMemoryException) 。这是因为 Hibernate 把所有新插入的客户(Customer)实例在 session 级别的缓存区进行了缓存的缘故

四、Hibernate运行过程:

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

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

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

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

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

       6.persistent operate持久化操作 //一般指Save这个方法

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

       8.关闭Session

      9.关闭SesstionFactory



原创粉丝点击