框架 day33 Hibernate,组件映射,继承映射,抓取(检索)策略-优化,检索方式总结

Posted 飛白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了框架 day33 Hibernate,组件映射,继承映射,抓取(检索)策略-优化,检索方式总结相关的知识,希望对你有一定的参考价值。

组件(组成)映射


例1:

public class Person {
	
	private Integer pid;	//OID 值
	private String name;
	
	//第一种方案
	private String homeAddr;
	private String homeTel;
	private String companyAddr;
	private String companyTel;

↑一般项目都都采用此方案()


*通过面向对象角度,使用设计模式(组件|组合),将数据都抽取到一个对象中。将多个对象组合在一起,达到重复利用目的。

例2:抽取数据(地址)到一个对象中, 这个值对象既为组件,组件不支持共享引用(没有OID)

public class Address {
	//值对象 (vo 值对象/po 持久对象/bo 业务对象)
	
	private String addr;
	private String tel;


public class Person {
	
	private Integer pid;	//OID 值
	private String name;
	//第二种方案:组合
	private Address homeAddress;
	private Address companyAddress;

组件映射配置

<hibernate-mapping>
	<class name="com.itheima.b_component.Person" table="t_person">
		<id name="pid">
			<generator class="native"></generator>
		</id>
		<property name="name"></property>
		
		<component name="homeAddress" class="com.itheima.b_component.Address">
			<property name="addr" column="homeAddr"></property>
			<property name="tel" column="homeTel"></property>
		</component>
		<component name="companyAddress" class="com.itheima.b_component.Address">
			<property name="addr" column="companyAddr"></property>
			<property name="tel" column="companyTel"></property>
		</component>
		
	</class>

</hibernate-mapping>

注意:必须确定组合javabean类型  <component class="">

每一个对象属性必须在表中都存在独有列名。<property column="...">



继承映射



应用场景:
公司的员工,保存:小时工和正式员工

员工类

public class Employee {
	
	private Integer eid;
	private String name;
小时工

public class HourEmployee extends Employee {
	
	private int rate;	//小时薪水
正式员工

public class SalaryEmployee extends Employee {
	
	private int salary; //正式薪金

简单方式

public class Employee {
	
	private Integer eid;
	private String name;
	private String temp;//标志 1;小时工2;正式工
	private int money;  //金额


继承方式1:<sub-class>


*所有内容保存一张表,给表提供表示字段,每一个子类具有独有字段



缺点:存在null值。


配置



继承方式2:<joined-subclass> (掌握)



*将提供三种表,主表存放基本信息,两个从表存放独有字段内容。



表之间存在一对一关系




一对一:
方式1:主表的主键,与从表的外键(唯一),形成主外键关系
方式2:主表的主键,与从表都主键,形成主外键关系



继承方式3:<union-class>


*将生成3张表,彼此之间没有关系,但主键值逐渐递增,需要hibernate自动维护三张表之间的主键唯一


*缺点: 主键生成策略 increment,不能通过数据库自动生成。存在并发问题
每一次都执行select语句,从三张表中查询oid的最大值。


配置




抓取(检索)策略--优化



*开发中,使用都是默认值,最后进行优化,根据业务要求进行相应设置



3.1检索方式



* 立即检索:在执行查询方法之后,立即执行select语句,进行查询。


//class 标签中lazy=false 立即检索
public void loadCustomerfalse(){
	Session session=sessionFacoty.openSession();
	Transaction tx=session.beginTransaction(); 
	//该行代码让hibernate执行select语句,查询数据库
	Customer c=(Customer)session.load(Customer.class, 1);
	c.getId();
	c.getAge();
	tx.commit();
	session.close();  
}



*延迟检索:在执行查询方法之后,没有进行查询,底层生成代理对象,直到需要相应的数据,再进行查询。


//class 标签中lazy=true 延迟检索
public void loadCustomertrue(){
       Session session=sessionFacoty.openSession();
       Transaction tx=session.beginTransaction(); 
       Customer c=(Customer)session.load(Customer.class, 1);
       //该行代码让hibernate执行select语句,
       //查询数据库(需要用的时候查数据库)
      c.getId();
      c.getAge(); 
      tx.commit();
      session.close();  
}


-相应的数据:除OID之外的值,关联数据。
-延迟加载在开发中,主要好处,延缓数据加载,在使用时才进行加载 (缩短数据在内存中时间)

-理解延迟检索中的代理





3.2检索类型



* 类级别检索:当前对象所有属性值。例如:Customer自己数据


  Customer c=(Customer)session.load(Customer.class, 1);


  session的方法直接检索Customer对象,对Customer对象到底采用立即检索 还是延迟检索方式
  通过class元素的lazy属性设定


*关联级别检索:当前对象关联对象数据。例如:Customer 关联 Order 数据


     Customer c=(Customer)session.load(Customer.class, 1);

     Set set=c.getOrders()//检索Order对象的set集合


     在这个例子中
     session.load(Customer.class, 1):查询的主体表

     c.getOrders().size():查询客体表的集合大小


     查询客体表是否发生,以何种方式发生(立即检索、延迟检索和迫切左外连接检索),就是关联级别检索

      通过set元素lazy属性设定


3.3类级别检索策略



*类级别:查询当前类的所有内容,只查询一次。优化指的是查询时机优化,让空闲时间服务器做出其他处理。
*session.get(Customer.class ,oid) 通过OID立即检索(查询),如果数据不存在返回null。
*session.load(Customer.class , oid ) 默认通过OID延迟检索,如果数据不存在将抛异常。
         类级别配置,只对load方法有效。
         Customer.hbm.xml <class name="" table=""lazy="true|false">
                   true:默认值,延迟检索
                   false:立即检索。

*无论 <class>元素的 lazy 属性是 true 还是 false,
-Session 的 get() 方法Query 的 list() 方法在类级别总是使用立即检索策略


*若 <class> 元素的 lazy 属性为 true 或取默认值, 
-Session 的 load() 方法不会执行查询数据表的 SELECT 语句, 仅返回代理类对象的实例, 该代理类实例有如下特征:
         >由 Hibernate 在运行时采用 javassist 工具动态生成
         >Hibernate创建代理类实例时, 仅初始化其 OID 属性
         >在应用程序第一次访问代理类实例的非 OID 属性时, Hibernate 会初始化代理类实例

*应用:
-如果程序加载一个对象的目的是为了访问它的属性, 可以采取立即检索. 
-如果程序加载一个持久化对象的目的是仅仅为了获得它的引用, 可以采用延迟检索


以上是关于框架 day33 Hibernate,组件映射,继承映射,抓取(检索)策略-优化,检索方式总结的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate day01笔记

框架 day38 SVN安装及使用,SSH练习项目CRM,环境搭建(myeclipse hibernate 反转引擎生成PO和映射)

Hibernate框架简单应用

Hibernate框架简述

Hibernate面试题

Hibernate框架简述