Hibernate框架技術視頻課程——筆記(四)
一、繼承映射
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...
? 配置二級緩存的步驟:
-
添加lib\optional\ehcache目錄下的jar包
-
在類路徑下創建ehcache.xml文件並配置
-
在hibernate.cfg.xml文件中開啟二級緩存並設置使用的二級緩存的實現類
<!-- 啟用二級緩存 --> <property name="cache.use_second_level_cache">true</property> <!-- 設置二級緩存的實現類,即指定使用的插件 --> <property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
-
指定要緩存的對象
<!-- 指定二級緩存的實體類 --> <class-cache usage="read-write" class="day04.cache.Account"/>
4. 查詢緩存
? 默認二級緩存只針對基於ID的查詢有效,如get()、load(),默認對HQL查詢無效,因此提供了針對非ID查詢的緩存,稱為查詢緩存
? 查詢緩存是基於二級緩存的,必須先配置二級緩存
? 配置查詢緩存的步驟:
-
在hibernate.cfg.xml文件中開啟查詢緩存
<property name="cache.use_query_cache">true</property>
-
使用查詢緩存
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反向工程
? 步驟:
- 創建一個數據庫連接
- 為項目添加Hibernate支持
- 使用反向工具根據數據庫表自動生成持久化類和映射文件
五、封裝GenericDao
?
Hibernate框架技術視頻課程——筆記(四)