1. 程式人生 > >Hibernate框架技術視頻課程——筆記(四)

Hibernate框架技術視頻課程——筆記(四)

tab generic hql type cacheable manage 系統 根據 osc

視頻課程鏈接: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

?

Hibernate框架技術視頻課程——筆記(四)