医疗企业网站模板免费下载,cdr 做网站,哪些网站可以免费做h5,wordpress网易云课堂Hibernate的检索策略包括立即检索和延迟检索#xff0c;可以在配置文件中通过对lazy、fetch、batch-size属性的设置来进行控制。一对多、多对多、多对一和一对一关系下的不同检索策略将影响对数据库访问的效率。
检索策略
立即检索#xff0c;立即加载检索方法指定的对象延…Hibernate的检索策略包括立即检索和延迟检索可以在配置文件中通过对lazy、fetch、batch-size属性的设置来进行控制。一对多、多对多、多对一和一对一关系下的不同检索策略将影响对数据库访问的效率。
检索策略
立即检索立即加载检索方法指定的对象延迟检索延迟加载检索方法指定的对象在使用具体属性值时才进行加载(这个时候会执行查询语句)
检索策略使用场景
如果加载对象是为了访问他的属性则使用立即加载如果加载对象目的是为了获得他的应用则可以使用延迟加载
检索策略属性
以一个老师有多个学生一对多的关系为例
lazy: 主要决定students集合被初始化的时机. 即到底是在加载 Teacher对象时就被初始化, 还是在程序访问 students 集合时被初始化fetch: 取值为 “select” 或 “subselect” 时, 决定初始化 students的查询语句的形式; 若取值为”join”, 则决定 students 集合被初始化的时机若把 fetch 设置为 “join”, lazy 属性将被忽略batch-size批量检索能减少 SELECT 语句的数目, 提高延迟检索或立即检索的运行性能
一对多和多对多的检索策略lazy和fetch取值对应策略
lazytrue ——– fatch默认 ——– 采用延迟检索lazyfalse ——– fatch默认 ——– 采用立即检索lazyextra ——– fatch默认 ——– 采用加强延迟检索(延迟对象集合初始化时机)lazytrue/false/extra ——– fatch默认 ——– 根据lazy决定执行检索策略lazytrue/false/extra ——– fatchsubselect ——– 根据lazy决定执行检索策略lazy默认 ——– fatchjoin ——– 采用迫切左外连接策略
多对一和一对一的检索策略lazy和fetch取值对应策略
lazyproxy ——– fetch默认 ——– 采用延迟检索lazynon-proxy ——– fetch默认 ——– 采用无代理延迟检索(需要增强持久化类的字节码才能实现)lazyfalse ——– fetch默认 ——– 采用立即检索lazy默认 ——– fetchjoin ——– 采用迫切左外连接策略(比立即检索用更少select语句)
实例验证
以下以学生与老师多对多的关系为例
实体类 学生 package test.hibernate.spring.model;import java.util.HashSet;
import java.util.Set;public class Student {private int id;private String name;private SetTeacher teachersnew HashSet();public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public SetTeacher getTeachers() {return teachers;}public void setTeachers(SetTeacher teachers) {this.teachers teachers;}public Student() {super();}Overridepublic String toString() {return Student [id id , name name ];}} 老师 package test.hibernate.spring.model;import java.util.HashSet;
import java.util.Set;public class Teacher {private int id;private String name;private SetStudent studentsnew HashSet();public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public SetStudent getStudents() {return students;}public void setStudents(SetStudent students) {this.students students;}public Teacher() {super();}Overridepublic String toString() {return Teacher [id id , name name ];}} 配置文件 Student.hbm.xml ?xml version1.0?
!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//EN
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
hibernate-mapping!-- 类级加载配置 lazy默认为true--class nametest.hibernate.spring.model.Student tables_students id nameid typeintcolumn names_id /generator classnative //idproperty namename typejava.lang.Stringcolumn names_name //property!-- 集合加载配置当lazytrue时不会检索fetchjoin时lazy属性无效将会使用left outer join进行检索减少对数据库的访问次数--!-- batch-size是设置每次访问数据库时检索的数量默认是1当值设大则会减少对数据库的访问次数但设得过大也会加大内存的负担需根据服务器的硬件配置来设置 --set nameteachers tablet_students_teachers inversetrue lazyfalse fetchjoin batch-size3keycolumn names_id //keymany-to-many classtest.hibernate.spring.model.Teacher columnt_id/many-to-many/set/class
/hibernate-mappingTeacher.hbm.xml ?xml version1.0?
!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//EN
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
hibernate-mappingclass nametest.hibernate.spring.model.Teacher tablet_teachersid nameid typeintcolumn namet_id /generator classnative //idproperty namename typejava.lang.Stringcolumn namet_name //propertyset namestudents tablet_students_teachers inversefalse fetchsubselect batch-size3keycolumn namet_id //keymany-to-many classtest.hibernate.spring.model.Student columns_id/many-to-many/set/class
/hibernate-mapping测试
/**
*Description:
*author: ljd
*date 2024年7月30日
*version 1.0
*/
package test.hibernate.spring;import java.util.List;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import test.hibernate.spring.model.Student;public class TestSession {SessionFactory sessionFactory null;Session session null;Transaction ts null;Beforepublic void beforP() {System.out.println(begin....);/* hibernate规定所有的配置或服务必须配置或注册到一个服务注册类中 */Configuration configuration new Configuration().configure();ServiceRegistry sr configuration.getStandardServiceRegistryBuilder().build();/* 从注册类中获得工厂类 */sessionFactory new MetadataSources(sr).buildMetadata().buildSessionFactory();/* 通过工厂类开启Session */session sessionFactory.openSession();/* 开启事务 */ts session.beginTransaction();}Afterpublic void endP() {System.out.println(end....);/* 提交事务 */ts.commit();/* 关闭Session */session.close();/* 关闭工厂 */sessionFactory.close();}// Testpublic void testGet() {// 使用get时 class标签中lazy值不管是true还是false都会直接加载,当set标签// 中fetchjoin时会在get时使用左join将其集体一起检索出来访问数据库只需一次// fetch值是其它时则需要访两次Student s session.get(Student.class, 1);System.out.println(s.getTeachers().size());}// Testpublic void testLoad() {// 使用load时 class标签中lazy是true时不会直接加载,是false时会直接加载Student s session.load(Student.class, 1);// 类中的集合是否直接检索取决于类是否是直接加载如果类是懒加载那么集合将是在访问时才会检索System.out.println(s.getTeachers().size());}Testpublic void testBatchSize() {String sql from Student;SuppressWarnings(unchecked)QueryStudent query session.createQuery(sql);ListStudent students query.list();for (Student s : students) {System.out.println(s.getTeachers().size());System.out.println(-----------------------------);}}
}