Hibernate框架技术视频课程——笔记(四)

视频课程链接:http://edu.51cto.com/course/10747.html

一、继承映射

1. 简介

1.1 概念

​ 在面向对象中很重要的一个特性就是继承,继承实现了代码的复用,Hibernate也支持继承映射

​ Hibernate支持三种继承映射方式:

  • 每个继承关系只用一张表
  • 每个子类一张表
  • 每个类一张表

1.2 继承关系

​ 系统有三个角色:系统用户、管理员、普通用户

  • 系统用户:id username password
  • 管理员: id username password tel
  • 普通用户:id username password addr

2. 每个继承关系只用一张表

2.1 数据库表

create table t_sysUser(
    id int primary key auto_increment,
    username varchar(200),
    password varchar(200),
    tel varchar(50),
    address varchar(200),
    type int -- 0 manager, 1 member
)engine Innodb default charset=utf8;

2.2 配置方式

<!-- 
   指定如何区分子类
    column:指定使用哪个字段来区分
   注:根据dtd约束规则,该元素要放到property元素的前面  
   -->
<discriminator column="type"></discriminator> 

<property name="username"></property>
<property name="password"></property>

<!-- 
   每个子类的配置
   -->
<subclass name="Manager" discriminator-value="0">
  <property name="tel"></property>
</subclass> 
<subclass name="Member" discriminator-value="1">
  <property name="addr"></property>
</subclass> 

3. 每个子类一张表

3.1 数据库表

create table t_manager(
    id int primary key auto_increment,
    username varchar(200),
    password varchar(200),
    tel varchar(50)
)engine Innodb default charset=utf8;

create table t_member(
    id int primary key auto_increment,
    username varchar(200),
    password varchar(200),
    addr varchar(200)
)engine Innodb default charset=utf8;

3.2 配置方式

<class name="Manager" table="t_manager">
  <id name="id" column="id">
    <generator class="native"></generator>
  </id>
  <property name="username"></property>
  <property name="password"></property>
  <property name="tel"></property>
</class>

4. 每个类一张表

4.1 数据库表

create table t_sysUSer(
    id int primary key auto_increment,
    username varchar(200),
    password varchar(200)
)engine Innodb default charset=utf8;

create table t_manager(
    id int primary key auto_increment,
    tel varchar(30),
    user_id int,
    foreign key(user_id) references t_sysUser(id)
)engine Innodb default charset=utf8;

create table t_member(
    id int primary key auto_increment,
    addr varchar(200),
    user_id int,
    foreign key(user_id) references t_sysUser(id)
)engine Innodb default charset=utf8;

4.2 配置方式

<!-- 
   通过外键关联的子类
   -->
<joined-subclass name="Manager" table="t_manager">
  <!-- 关联列,外键列 -->
  <key column="user_id"></key>
  <!-- 包含的属性 -->
  <property name="tel"></property>
</joined-subclass>  

<joined-subclass name="Member" table="t_member">
  <!-- 关联列,外键列 -->
  <key column="user_id"></key>
  <!-- 包含的属性 -->
  <property name="addr"></property>
</joined-subclass>  

二、Hibernate缓存

1. 简介

​ Hibernate缓存可以为三类:

  • 一级缓存
  • 二级缓存
  • 查询缓存

2. 一级缓存

​ 一级缓存就是Session范围内的缓存,也称为Session缓存,Session自带

​ 作用:

  • 减少访问数据率的频率,提高检索效率
  • 保证数据库中的数据与缓存中的对象同步

    管理Session的方法:
  • clear() 清空缓存
  • evict(Object o) 从缓存中删除指定的持久化对象

3. 二级缓存

​ 二级缓存是SessionFactory范围内的缓存,可以被所有Session所共享

​ 二级缓存需要单独配置缓存插件,常用的二级缓存插件:EHCache、OSCache、JBossCache...

​ 配置二级缓存的步骤:

  1. 添加lib\optional\ehcache目录下的jar包

  2. 在类路径下创建ehcache.xml文件并配置

  3. 在hibernate.cfg.xml文件中开启二级缓存并设置使用的二级缓存的实现类

    <!-- 启用二级缓存 -->
    <property name="cache.use_second_level_cache">true</property>
    <!-- 设置二级缓存的实现类,即指定使用的插件 -->
    <property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
  4. 指定要缓存的对象

    <!-- 指定二级缓存的实体类 -->
    <class-cache usage="read-write" class="day04.cache.Account"/>

4. 查询缓存

​ 默认二级缓存只针对基于ID的查询有效,如get()、load(),默认对HQL查询无效,因此提供了针对非ID查询的缓存,称为查询缓存

​ 查询缓存是基于二级缓存的,必须先配置二级缓存

​ 配置查询缓存的步骤:

  1. 在hibernate.cfg.xml文件中开启查询缓存

    <property name="cache.use_query_cache">true</property>
  2. 使用查询缓存

    String hql="from Account a where a.name like :name";
    Query query=session.createQuery(hql).setString("name", "%m%");
    query.setCacheable(true); //使用查询缓存
    System.out.println(query.list());

    注:只有当执行的hql语句完全相同时才会使用查询缓存

适用场景:

  • 经常使用的查询语句
  • 对查询到的数据很有修改操作

三、Hibernate注解

1. 简介

1.1 繁琐的映射文件

​ 传统上Hibernate的配置依赖于xxx.hbm.xml文件,需要在映射文件中指定实体对象和数据库表之间的关系,并且在启动时加载

​ 使用Hibernte注解,可以将映射信息写入到Java类中,不再需要xxx.hbm.xml文件,简化开发

1.2 什么是JPA

​ Java Persistence API,Java持久化API

​ JPA和Hibernate的关系:JPA是标准接口,Hibernate是实现,功能更加强大

1.3 Hibernate注解分类

  • 类级别注解
  • 属性级别注解
  • 映射关系注解

2. 常用注解

2.1 持久化类相关

注解 含义和作用
@Entity 将一个类声明为持久化类
@Table 为持久化类映射指定的表
@Id 声明持久化类的标识属性
@GenerateValue 主键生成策略
@Column 将属性映射到列
@NamedQuery 配置命名

2.2 关联关系相关

注解 含义和作用
@OneToMany
@OneToOne
@ManyToOne
@ManyTo

3. 基本用法

四、MyEclipse反向工程

​ 步骤:

  1. 创建一个数据库连接
  2. 为项目添加Hibernate支持
  3. 使用反向工具根据数据库表自动生成持久化类和映射文件

五、封装GenericDao

猜你喜欢

转载自blog.51cto.com/12402007/2159437