• 懒加载和抓取策略


    懒加载用于何时发出sql语句

    抓取策略用于如何发出sql语句,

    join连接形式的 当查出的一条的记录情况时候有效,子查询不起作用,select  * from  table1这是隐士子查询

     还是 select  n+1语句 还是 subselect子查询2条语句  select * from table1 where (select * in (table2))

    在 <set>那里添加这两个属性。

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     4 <hibernate-mapping>
     5     <class name="cn.itcast.hiberate.sh.domain.Classes">
     6         <id name="cid" length="5" type="java.lang.Long">
     7             <generator class="increment"></generator>
     8         </id>
     9         <property name="cname" length="20" type="java.lang.String"></property>
    10         
    11         <property name="description" length="100" type="java.lang.String"></property>
    12         <!-- 
    13             set元素对应类中的set集合
    14             通过set元素使classes表与student表建立关联
    15                key是通过外键的形式让两张表建立关联
    16                one-to-many是通过类的形式让两个类建立关联
    17             
    18             cascade 级联
    19                save-update
    20                    1、当 保存班级的时候,对学生进行怎么样的操作
    21                         如果学生对象在数据库中没有对应的值,这个时候会执行save操作
    22                         如果学生对象在数据库中有对应的值,这个时候会执行update操作
    23                delete
    24                all
    25             inverse  维护关系
    26                true      不维护关系     
    27                false     维护关系
    28                default   false
    29          -->
    30         <set name="students" cascade="save-update" inverse="true" lazy="false" fetch="join">
    31             <!-- 
    32                 key是用来描述外键
    33              -->
    34             <key>
    35                 <column name="cid"></column>
    36             </key>
    37             <one-to-many class="cn.itcast.hiberate.sh.domain.Student"/>
    38         </set>
    39     </class>
    40 </hibernate-mapping>

     懒加载

     1 package cn.itcast.hibernate.sh.test;
     2 
     3 import java.util.Set;
     4 
     5 import org.hibernate.Session;
     6 import org.junit.Test;
     7 
     8 import cn.itcast.hiberate.sh.domain.Classes;
     9 import cn.itcast.hiberate.sh.domain.Student;
    10 import cn.itcast.hibernate.sh.utils.HiberanteUtils;
    11 
    12 public class LazyTest extends HiberanteUtils{
    13     static{
    14         url = "hibernate.cfg.xml";
    15     }
    16     /**
    17      * 类的懒加载
    18      */
    19     @Test
    20     public void testLoad(){
    21         Session session = sessionFactory.openSession();
    22         Classes classes = (Classes)session.load(Classes.class, 1L);
    23         session.close();
    24         classes.getCname();
    25     }
    26     
    27     /**
    28      * 集合的延迟加载
    29      */
    30     @Test
    31     public void testSet(){
    32         Session session = sessionFactory.openSession();
    33         Classes classes = (Classes)session.get(Classes.class, 1L);
    34         Set<Student> students = classes.getStudents();
    35         for(Student student:students){//这个时候才要发出sql语句
    36             System.out.println(student.getSname());
    37         }
    38         session.close();
    39     }
    40     
    41     /**
    42      * 集合的延迟加载
    43      */
    44     @Test
    45     public void testSet_EXTRA(){
    46         Session session = sessionFactory.openSession();
    47         Classes classes = (Classes)session.get(Classes.class, 1L);
    48         Set<Student> students = classes.getStudents();
    49         System.out.println(students.size());
    50         session.close();
    51     }
    52 }

    抓取策略

     1 package cn.itcast.hibernate.sh.test;
     2 
     3 import java.util.List;
     4 import java.util.Set;
     5 
     6 import org.hibernate.Session;
     7 import org.junit.Test;
     8 
     9 import cn.itcast.hiberate.sh.domain.Classes;
    10 import cn.itcast.hiberate.sh.domain.Student;
    11 import cn.itcast.hibernate.sh.utils.HiberanteUtils;
    12 
    13 public class FetchTest extends HiberanteUtils{
    14     static{
    15         url = "hibernate.cfg.xml";
    16     }
    17     
    18     /**
    19      * n+1的问题
    20      *    解决问题的方案:子查询  fetch="subselect"
    21      */
    22     @Test
    23     public void testAll_Classes(){
    24         Session session = sessionFactory.openSession();
    25         List<Classes> cList = session.createQuery("from Classes").list();
    26         for(Classes classes:cList){
    27             Set<Student> students = classes.getStudents();
    28             for(Student student:students){
    29                 System.out.println(student.getSname());
    30             }
    31         }
    32         session.close();
    33     }
    34     
    35     /**
    36      * n+1的问题
    37      *    解决问题的方案:子查询  fetch="subselect"
    38      */
    39     @Test
    40     public void testClasses_Some(){
    41         Session session = sessionFactory.openSession();
    42         List<Classes> cList = session.createQuery("from Classes where cid in(1,2,3)").list();
    43         for(Classes classes:cList){
    44             Set<Student> students = classes.getStudents();
    45             for(Student student:students){
    46                 System.out.println(student.getSname());
    47             }
    48         }
    49         session.close();
    50     }
    51     
    52     @Test
    53     public void testQueryClasses_Id(){
    54         Session session = sessionFactory.openSession();
    55         Classes classes = (Classes)session.get(Classes.class, 1L);
    56         Set<Student> students = classes.getStudents();
    57         for(Student student:students){
    58             System.out.println(student.getSname());
    59         }
    60         session.close();
    61     }
    62 }
  • 相关阅读:
    Medium | LeetCode 11. 盛最多水的容器 | 双指针
    Hard | LeetCode 41. 缺失的第一个正数 | 原地Hash
    Navicat Premium 15 使用注册机破解,附带Navicat Premium 15安装包、注册机下载
    vue $forceUpdate() 强制重新渲染
    js 原生录制屏幕
    mysql 8.0.17 解压版安装教程
    vue 移动端适配 amfe-flexibl
    mysql重置密码
    2059-Authentication plugin'caching_sha2_password'cannot be loaded
    用js实现时间减去前1小时、7天、1月、1年
  • 原文地址:https://www.cnblogs.com/friends-wf/p/3777732.html
Copyright © 2020-2023  润新知