zoukankan      html  css  js  c++  java
  • Hibernate-检索策略

    一、立即检索策略的缺点:
    1、select语句的数目太多,需要频繁的访问数据库,会影响检索性能。如果需要查询n个Customer对象,那么必须执行n+1次select查
    询语句。这种检索策略没有利用SQL的连接查询功能,例如以上5条select语句完全可以通过以下1条select语句来完成:
    select * from CUSTOMERS left outer join ORDERS on CUSTOMERS.ID=ORDERS.CUSTOMER_ID 
        以上select语句使用了SQL的左外连接查询功能,能够在一条select语句中查询出CUSTOMERS表的所有记录,以及匹配的ORDERS表的记录。
    2、在应用逻辑只需要访问Customer对象,而不需要访问Order对象的场合,加载Order对象完全是多余的操作,这些多余的Order对象白白浪费了许多内存空间。
     
     
    二、延迟检索策略
    如:对于<set>元素,应该优先考虑使用延迟检索策略:<set  name="orders"   inverse="true"    lazy="true" >
    优点
    由应用程序决定需要加载哪些对象,可以避免执行多余的select语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并且能节省内存空间。
    缺点应用程序如果希望访问游离状态的代理类实例,必须保证它在持久化状态时已经被初始化。
    适用范围:(1)一对多或者多对多关联。(2)应用程序不需要立即访问或者根本不会访问的对象。
     
     
    三、在多对一关联级别使用迫切左外连接检索策略 
    如果把Order.hbm.xml文件的<many-to-one>元素的fetch属性设为join,则使用迫切左外连接检索策略。
    优点:
    (1)对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象。
    (2)使用了外连接,select语句数目少。
    缺点:
    (1)可能会加载应用程序不需要访问的对象,白白浪费许多内存空间。
    (2)复杂的数据库表连接也会影响检索性能。
    适用范围:
    (1)多对一或者一对一关联。
    (2)应用程序需要立即访问的对象。
    (3)数据库系统具有良好的表连接性能
     
    四、在程序中显式指定迫切左外连接检索策略
    session .createQuery("from Customer as c left join fetch c.orders where c.id=1").list();
    在执行查询方法时,在HQL语句中显式指定迫切左外连接检索关联的Order对象,因此会覆盖映射文件配置的检索策略。不管在Customer.hbm.xml文件中<set>元素的lazy属性是true还是false,Hibernate都会执行以下select语句:
    select * from CUSTOMERS left outer join ORDERS on CUSTOMERS.ID =ORDERS.CUSTOMER_ID where CUSTOMERS.ID=1;
  • 相关阅读:
    Java实例_队列Queue用法
    JAVA中不同类型的取值范围
    面试被问到的题
    关于Maven启动项目各种.xml文件和.properties文件找不到问题的解决
    jupyter使用
    java中“==”和equal区别
    redis持久化的几种方式
    事务是什么,以及事务四个特性
    Java中的String类能否被继承?为什么?以及final和static的区别
    pytest.mark.parametrize 参数化
  • 原文地址:https://www.cnblogs.com/gy19920604/p/5379117.html
Copyright © 2011-2022 走看看