Hibernate中的抓取策略总结

来源:互联网 发布:shopinfo.php 漏洞 编辑:程序博客网 时间:2024/06/05 15:12

重点内容
1.抓取策略:抓取策略,在我看来就是对对象之间有关联的对象进行查询过程中如何获取关联对象的策略。
2.抓取策略和实体查询的相同点:都是查询数据!!!
(一). 直接抓取和延迟抓取

package cn.codeWang.entity;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entity(name = "Department")public class Department {    @Id    @GeneratedValue    private Long id;    private String departname;    public Department() {    }    public String getDepartname() {        return departname;    }    public void setDepartname(String departname) {        this.departname = departname;    }}package cn.codeWang.entity;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToOne;@Entity(name = "Employee")public class Employee {    @Id    @GeneratedValue    private Long id;    private String empname;    @ManyToOne(fetch = FetchType.LAZY)    private Department department;    public Employee() {    }    public String getEmpname() {        return empname;    }    public void setEmpname(String empname) {        this.empname = empname;    }    public Department getDepartment() {        return department;    }    public void setDepartment(Department department) {        this.department = department;    }}import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.boot.MetadataSources;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.service.ServiceRegistry;import org.junit.After;import org.junit.Before;import org.junit.Test;import cn.codeWang.entity.Department;import cn.codeWang.entity.Employee;public class DemoTest {    private SessionFactory sessionFactory;    private Session session;    private Transaction transaction;    @Before    public void init() {        // 创建服务注册对象        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();        // 创建会话工厂对象        sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();        // 会话对象        session = sessionFactory.openSession();        // 开启事物        transaction = session.beginTransaction();    }    @After    public void destory() {        // 提交事物        transaction.commit();        // 关闭会话        session.close();        // 关闭会话工厂        sessionFactory.close();    }    @Test    //筛选需要的数据    public void testFetchTypeEAGER() {         Employee emp = session.get(Employee.class, 3l);         System.out.println("员工姓名="+emp.getEmpname());         System.out.println(" 部门="+emp.getDepartment().getDepartname());    }@Test    //筛选需要的数据    public void testFetchLazy() {         Employee emp = session.get(Employee.class, 3l);         System.out.println("员工姓名="+emp.getEmpname());         System.out.println(" 部门="+emp.getDepartment().getDepartname());    }}

A1.使用@ManyToOne(fetch = FetchType.LAZY)控制台输出结果为:

Hibernate:     alter table Employee        add constraint FK14tijxqry9ml17nk86sqfp561        foreign key (department_id)        references Department (id)Hibernate:     select        employee0_.id as id1_1_0_,        employee0_.department_id as departme3_1_0_,        employee0_.empname as empname2_1_0_     from        Employee employee0_     where        employee0_.id=?员工姓名=张一山Hibernate:     select        department0_.id as id1_0_0_,        department0_.departname as departna2_0_0_     from        Department department0_     where        department0_.id=? 部门=工程部

A2.使用@ManyToOne(fetch = FetchType.EAGER)控制台输出结果为:

Hibernate:     alter table Employee        add constraint FK14tijxqry9ml17nk86sqfp561        foreign key (department_id)        references Department (id)Hibernate:     select        employee0_.id as id1_1_0_,        employee0_.department_id as departme3_1_0_,        employee0_.empname as empname2_1_0_,        department1_.id as id1_0_1_,        department1_.departname as departna2_0_1_     from        Employee employee0_     left outer join        Department department1_             on employee0_.department_id=department1_.id     where        employee0_.id=?员工姓名=张一山 部门=工程部

总结:
1.使用直接抓取策略Hibernate直接发出一条select查询语句查询连接表。
2.使用延迟抓取策略Hibernate一前一后发出两条select查询语句分别查询两张表的数据。

(二)批量抓取策略

作用: Hibernate提供@BatchSize,它用来抓取未初始化的实体代理。