1. 程式人生 > >【SSH系列】Hibernate對映 -- 繼承對映

【SSH系列】Hibernate對映 -- 繼承對映

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

 開篇前言

 在前面的博文中,小編介紹了hibernate中的對映,一對一,一對多,多對多,單向,雙向等,今天這篇博文,小編主要來介紹一下hibernate中的繼承對映,小夥伴都知道在C#中,如果想要實現繼承,直接在子類中新增冒號即可繼承父類,在java中可以用關鍵字extends實現,那麼在hibernate中,什麼是繼承對映呢?繼承對映的方式又是什麼?繼承對映具有幾種策略呢?不同策略之間又存在著怎麼樣的區別和聯絡呢?該博文,小編就來簡單的總結一下hibernate中的繼承對映。

 繼承對映是什麼

 首先,我們來看這樣的一張表結構:

          

 上述的表結構就是繼承對映的一種,小豬豬和小鳥鳥他們共用了欄位Name和Sex,除此之外,有些欄位是針對某種資料而存在的,所以在資料庫中為空,如上所,weight是針對小豬豬而言的,而height是針對小鳥鳥而言的,從上面的表結構,我們可以得出,有些欄位是共用的,有些欄位是自己獨有的,她們通過type這個欄位來進行區別,ok,小編相信,小夥伴們現在對繼承對映已經有了一定的瞭解,接著小編來介紹繼承對映的方式。   

  繼承對映方式

 在前面的博文中,小編提到過,c#和java中的繼承,但是在資料庫的世界中,表之間是沒有任何關鍵字可以明確指明這兩張表的父子關係,表與表是沒有繼承關係這樣的說法的。為了將程式領域中的繼承關係反映到資料中,Hibernate為我們提供了三種策略,分別是:
 a、每顆類繼承樹一張表;
 b、每個類一張表;
 c、每個具體類一張表;
 我們依然從uml入手,看物件模型,如下所示:
 
 Pig和Bird都繼承Animal,她們都有id,name,sex,但是Pig主要看weight,而Bird主要看height,此時如果把這些資料存入到資料庫中,可以有三種方案,也就是三種策略。ok,接下來結合Animal這個例子,分別對三種策略進行講解。
 

第一種、每顆類繼承樹一張表
 這種方式,只生成一個table,對應的繼承對映策略是“單表繼承”。如圖:   

 

 每顆類繼承樹一張表,也就是使用一張表表示所有繼承體系下的類的屬性的並集,這種策略是使用<subclass>標籤來實現的。因為類繼承體系下會有許多個子類,要把多個類的資訊存放在一張表中,必須有某種機制來區分哪些記錄是屬於哪個類的。Hibernate中的這種機制就是,在表中新增一個欄位,用這個欄位的值來進行區分。在表中新增這個標示列使用<discriminator>標籤來實現,hbm.xml檔案如下所示:

<?xml version="1.0"?>  <!DOCTYPE hibernate-mapping PUBLIC       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  <hibernate-mapping package="com.bjpowernode.hibernate">   <class name="Animal" table="t_animal" lazy="false">  <id name="id">   <generator class="native"/>  </id>  <discriminator column="type" type="string"/>  <property name="name"/>  <property name="sex"/>  <subclass name="Pig" discriminator-value="P">   <property name="weight"/>    </subclass>  <subclass name="Bird" discriminator-value="B">   <property name="height"/>  </subclass>  </class>         </hibernate-mapping>
 第二種、每個類一張表

 這種方式,每個類生成一個table,對應的繼承策略是“類表繼承”。如圖:
 

 這種策略是使用<joined-subclass>標籤來定義子類的。父類、子類都對應一張資料庫表。在父類對應的資料庫表中,它儲存了所有記錄的公共資訊,實際上該父類對應的表會包含所有的記錄,包括父類和子類的記錄;在子類對應的資料庫表中,這個表只定義了子類中所特有的屬性對映的欄位。子類對應的資料表與父類對應的資料表,通過一對一主鍵關聯的方式關聯起來。Hbm.xml檔案如下所示:

<?xml version="1.0"?>  <!DOCTYPE hibernate-mapping PUBLIC       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  <hibernate-mapping package="com.bjpowernode.hibernate">   <class name="Animal" table="t_animal">  <id name="id">   <generator class="native"/>  </id>  <property name="name"/>  <properties name="sex"/>  <joined-subclass name="Pig" table="t_pig">   <key column ="pid"/>   <property name="weight"/>  </joined-subclass>    <joined-subclass name="Bird" table="t_bird">   <key column = "bird"/>   <property name="height"/>  </joined-subclass>  </class>      </hibernate-mapping>
 第三種、每個具體類一張表
 這種方式,生成三張表,對應的策略是“具體表繼承”,如下圖所示:

 

相關推薦

SSH系列Hibernate對映 -- 繼承對映

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

SSH系列Hibernate對映 -- 一對一單向關聯對映

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

EF系列EntityFrameWork實體關係對映

一、前言       在我們搭建框架的時候,總會建立一個”實體層“,這個實體層中的“實體”是和資料庫中的“表”相對應的。當寫實體層的時候就要我們手動寫很多結構相似的程式碼。非常的繁瑣。為此,小編向大家

SSH框架Hibernate系列

路徑 應用 port setname domain 配置文件 學習 縮進 object 微信公眾號:compassblog 歡迎關註、轉發,互相學習,共同進步! 有任何問題,請後臺留言聯系! 1、Hibernate框架概述 (1)、什麽是HibernateH

SSH框架系列之 Spring 整合 Hibernate 框架

操作 enter pda 就是 負責 spring配置 1.0 port -s 1、SSH 三大框架整合原理 Spring 與 Struts2 的整合就是將 Action 對象交給 Spring 容器來負責創建。 Spring 與 Hibernate 的整合就是將

SSH 基礎淺談Hibernate關系映射(3)

區別 ack 增加 ans 存儲結構 mil pro 映射 方向 繼上篇博客 一對多關聯映射(單向) 上面我們介紹了多對一,我們反過來看一對多不就是多對一嗎?那還用再進行不同的映射嗎?有什麽區別嗎?一對多和多對一映射原理是一致的,存儲是同樣的。也就是生成的數據庫

SSH框架之Struts2系列(一)

核心 mapping 調度 fault code 組件 -i -c params 微信公眾號:compassblog 歡迎關註、轉發,互相學習,共同進步! 有任何問題,請後臺留言聯系 1、Struts2框架概述 (1)、什麽是Struts2 Struts2是一種基於M

SSH框架之Spring系列(一)

oca getc per 名稱 寫入 xmla java開發 無需 不能 微信公眾號:compassblog 歡迎關註、轉發,互相學習,共同進步! 有任何問題,請後臺留言聯系! 1、前言 前面更新過幾篇關於 Struts2 框架和 Hibernate 框架的文章,但鑒於

SpringMVC框架註解的處理器對映器和介面卡配置

下面我們來探討註解的處理器對映器和介面卡 1.註解的處理器對映器和介面卡 在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping註解對映器。 在

SSH框架之Hibernate的關聯對映之一對多、多對一對映

關聯對映之一對多、多對一對映 一、需求: 部門與員工 一個部門有多個員工 【一對多】 多個員工,屬於一個部門 【多對一】 二、邏輯分析: 三、程式碼實現 1、javabean及對映檔案的配置: 1)Employee.java、Employ

linux系列vmware12pro安裝centos7

ping entos 配置 行編輯 rip 無法 conf 解決 config 安裝參考:http://blog.csdn.net/guin_guo/article/details/49403889 安裝完成之後ip還是不成功無法連接網絡: 進入/etc/sysconfig

Yii系列處理請求

入口 實現 官方 cookie this sender att 只需要 ota 緣起 這一章是Yii系列的第三章,前兩章給大夥講解了Yii2.0的安裝與Yii2.0的基本框架及基礎概念,傳送門: 【Yii2.0的安裝與調試】:http://www.cnblogs.com/r

CNMP系列CentOS7.0下安裝Nginx服務

系統資源 for proxy input strong network emc -c .com 話步前言,CNMP之路,系統起步:http://www.cnblogs.com/riverdubu/p/6425028.html 這回我來講解下CentOS7.0下如何安裝和配置

CNMP系列CNMP之路,系統起步。

ftp 系列 fig samba 建立連接 編輯 為我 作用 let 簡單的來理解,我所說的CNMP,不是CNM+P,而是CentOs+Nginx+MySql+PHP,也可以單純的理解為LNMP,但是系統是我們自己選的,雖說是Linux的一個分支,但我就喜歡CentOs的這

PHP系列PHP組件詳解

命令行 分享 .cn .com function package etc quest 說我 緣起 楓爺之前做過幾年的PHP的研發,大部分都是在開源框架的引導下,編寫代碼。現在依然,本能的會去讓我使用某個PHP框架開發PHP應用,也是因為懶吧,沒有好好的去研究研究除了框架之外

HLSDK系列服務端 UpdateClientData 函數

del 完全 dll viewmodel 代碼 lag ase mod water 首先說明下,這個函數是寫在 mp.dll 裏的。 服務器會給每個客戶端發送一些數據,其中兩大數據種類就是 clientdata_t 和 entity_state_t 這裏要說的是 clien

HLSDK系列服務端 AddToFullPack 函數

客戶端 global 客戶 const start max pre 參數 glob 服務端會給客戶端發送一些數據,其中兩大種類數據是 clientdata_t 和 entity_state_t 這裏我們說說 entity_state_t 這個結構體。 你在丟在地上的槍、C4

HLSDK系列怎麽增加一種新實體

sta fun class 使用 pen 關聯 creat bsp cnblogs 你平常肯定接觸到很多比如 info_player_start hostage info_target 之類的實體,這裏就解釋一下怎麽創建一種新的實體。 首先建立一個新的 .h 文件(當然你寫

HLSDK系列HL引擎入門篇

入門 理解 我的文章 模塊 兩個 工作 什麽 服務端 為我 如果你打算拿HL的源碼(也就是HLSDK)來改出一個自己的遊戲,那你就非常有必要理解一些HL引擎的工作方式。 HL引擎分成兩個部分,服務端和客戶端。服務端管理所有玩家的狀態和遊戲規則,客戶端負責顯示UI和特效…之類

HLSDK系列服務端實體 edict_t 和 控制類

武器 .cpp 成員 常用 blog 生成 指針 但是 dll 我們來了解一下引擎是怎麽管理實體的吧!我們這裏就說說服務端的實體(edict_t) 服務端用 edict_t 這個結構體來保存一個實體,可以說一個 edict_t 就是一個 服務端實體,下文簡稱實體。 我們在