1. 程式人生 > >hibernate繼承關係對映方法(三)--每個具體類一張表TPC

hibernate繼承關係對映方法(三)--每個具體類一張表TPC

TPC:所謂是“每個具體類一張表(table per concrete class)”的意思是:使繼承體系中每一個子類都對應資料庫中的一張表每一個子類對應的資料庫表都包含了父類的資訊,並且包含了自己獨有的屬性。每個子類對應一張表,而且這個表的資訊是完備的,即包含了所有從父類繼承下來的屬性對映的欄位。這種策略是使用<union-subclass>標籤來定義子類的。


注意:三個類+一個父類對映檔案+兩張表


student表


worker表


測試工程:


Person.java

package com.hust.PO;

public class Person {
     private Integer id;   
     private String name;   //姓名
     private Integer age;    //年齡
     private String sex;     //性別
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
     
     
}
Student.java
package com.hust.PO;

public class Student extends Person {
	  
       private String sno;    //學號
       private String school;  //學校
    	
	public String getSno() {
		return sno;
	}
	public void setSno(String sno) {
		this.sno = sno;
	}
	public String getSchool() {
		return school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
       
}
Worker.java
package com.hust.PO;

public class Worker extends Person {
	
	 private String wno;      //工號
     private Double salary;   //工資
   

	public String getWno() {
		return wno;
	}
	public void setWno(String wno) {
		this.wno = wno;
	}
	public Double getSalary() {
		return salary;
	}
	public void setSalary(Double salary) {
		this.salary = salary;
	}
     
} 
父類對映檔案Person.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.hust.PO">  
    <!-- table per concrete(TPC) (a. 具體的,實際的) -->  
    <!-- 每一個具體類一張表 -->  
    <!-- 虛擬選項為'true' -->  
    <class name="Person" table="person" abstract="true">  <!-- 多設定一個屬性abstract="true",因為根本就沒有person表 -->
    <id column="Id" name="id" type="integer">  
        <!-- 主鍵的生成策略為'分配' -->  
        <generator class="assigned"></generator>  
    </id>  
    <property column="Name" name="name" type="string"></property>  
    <property column="Sex" name="sex" type="string"></property>  
    <property column="Age" name="age" type="integer"></property>  <!-- 公共屬性 -->
      
    <!--student具體類-->  
    <union-subclass name="Student" table="student">  
        <property column="Sno" name="sno" type="string"></property>      <!-- 特徵屬性 --> 
        <property column="School" name="school" type="string"></property>  <!-- 特徵屬性 -->
    </union-subclass>  
      
    <!--worker具體類-->  
    <union-subclass name="Worker" table="worker">  
        <property column="Wno" name="wno" type="string"></property>  <!-- 特徵屬性 -->
        <property column="Salary" name="salary" type="double"></property>  <!-- 特徵屬性 -->
    </union-subclass>  
      
    </class>  
</hibernate-mapping>  
<union-subclass>標籤是用於指示出該hbm檔案所表示的類的子類,如Person類有兩個子 類,就需要兩個<union-subclass>標籤以此類推。

<union-subclass>標籤的"name"屬性用於指 定子類的全限定名稱,"table"屬性用於指定該子類對應的表的名稱,"extends"屬性用於指定該子類的父類,

注意:"extends"屬性與<union-subclass>標籤的位置有關,若<union-subclass>標籤作為<class>標籤的子標籤,則"extends"屬性可以不設定,否則需要明確設定"extends"屬性。

<class>標籤中的"abstract"屬性如果值為true則,不會生成表結構。如果值為false則會生成表結構,但是不會插入資料。

資料庫檔案TableDao.java

package com.hust.Dao;

import org.hibernate.Session;
import org.hibernate.Transaction;
import SessionFactory.HibernateSessionFactory;
import com.hust.PO.Student;
import com.hust.PO.Worker;

public class TableDao {
     //儲存學生資訊
	public void saveStu(Student stu){
		  Session session=HibernateSessionFactory.getSession();
		    Transaction ts=null;
		    try{
		    	ts=session.beginTransaction();		        
		    	session.saveOrUpdate(stu);
		    	ts.commit();
		    }catch(Exception ex){
		    	ts.rollback();
		    	System.out.println("新增學生資訊失敗");
		    }finally{
		    	HibernateSessionFactory.closeSession();
		    }
	}
	/*session.saveOrUpdate(stu);控制檯列印的HQL
	 * Hibernate: 
    select
        student_.Id,
        student_.Name as Name0_,
        student_.Sex as Sex0_,
        student_.Age as Age0_,
        student_.Sno as Sno1_,
        student_.School as School1_ 
    from
        student student_ 
    where
        student_.Id=?
Hibernate: 
    insert 
    into
        student
        (Name, Sex, Age, Sno, School, Id) 
    values
        (?, ?, ?, ?, ?, ?)
*/
	//載入學生資訊
	 public Student loadStu(Integer id){
		     Session session=HibernateSessionFactory.getSession();
		    Transaction ts=null;
		    Student stu=null;
		    try{
		    	ts=session.beginTransaction();
		    	stu=(Student)session.get(Student.class, id);
		    	ts.commit();
		    }catch(Exception ex){
		    	ts.rollback();
		    	System.out.println("載入學生資訊失敗");
		    }finally{
		    	HibernateSessionFactory.closeSession();
		    }
		    return stu;
	 }
	 /* stu=(Student)session.get(Student.class, id);控制檯列印的HQL
	Hibernate: 
    select
        student0_.Id as Id0_0_,
        student0_.Name as Name0_0_,
        student0_.Sex as Sex0_0_,
        student0_.Age as Age0_0_,
        student0_.Sno as Sno1_0_,
        student0_.School as School1_0_ 
    from
        student student0_ 
    where
        student0_.Id=?*/
	//儲存工人資訊
		public void saveWorker(Worker worker){
			  Session session=HibernateSessionFactory.getSession();
			    Transaction ts=null;
			    try{
			    	ts=session.beginTransaction();		        
			    	session.saveOrUpdate(worker);
			    	ts.commit();
			    }catch(Exception ex){
			    	ts.rollback();
			    	System.out.println("新增工人資訊失敗");
			    }finally{
			    	HibernateSessionFactory.closeSession();
			    }
		}
		/*session.saveOrUpdate(worker);控制檯列印的HQL
		 * Hibernate: 
    select
        worker_.Id,
        worker_.Name as Name0_,
        worker_.Sex as Sex0_,
        worker_.Age as Age0_,
        worker_.Wno as Wno2_,
        worker_.Salary as Salary2_ 
    from
        worker worker_ 
    where
        worker_.Id=?
        Hibernate: 
    insert 
    into
        worker
        (Name, Sex, Age, Wno, Salary, Id) 
    values
        (?, ?, ?, ?, ?, ?)
*/
		//載入工人資訊
		 public Worker loadWorker(Integer id){
		     Session session=HibernateSessionFactory.getSession();
		    Transaction ts=null;
		    Worker worker=null;
		    try{
		    	ts=session.beginTransaction();
		    	worker=(Worker)session.get(Worker.class, id);
		    	ts.commit();
		    }catch(Exception ex){
		    	ts.rollback();
		    	System.out.println("載入工人資訊失敗");
		    }finally{
		    	HibernateSessionFactory.closeSession();
		    }
		    return worker;
	 }
		/*worker=(Worker)session.get(Worker.class, id);控制檯列印的HQL
		 * 
		 * Hibernate: 
    select
        worker0_.Id as Id0_0_,
        worker0_.Name as Name0_0_,
        worker0_.Sex as Sex0_0_,
        worker0_.Age as Age0_0_,
        worker0_.Wno as Wno2_0_,
        worker0_.Salary as Salary2_0_ 
    from
        worker worker0_ 
    where
        worker0_.Id=?

		
*/
	
}
測試頁面test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.hust.Dao.*" %>
<%@ page import="com.hust.PO.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>hibernate的繼承關係(三)每個具體類一張表TPC</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  <body>
      <h2>hibernate的繼承關係(三)--每個具體類一張表TPC</h2>
      <hr>
      <%
               //新建學生物件
      	       Student stu=new Student();
               stu.setId(new Integer(1));
               stu.setName("tuke");
               stu.setAge(new Integer(22));
               stu.setSex("nan");
               stu.setSno("M201571885");
               stu.setSchool("華中科技大學");
               //儲存stu物件
               TableDao dao=new TableDao();
               dao.saveStu(stu);
               //從資料庫中獲取stu物件
               Student stu1=dao.loadStu(stu.getId()); //載入子類物件
               
               out.println("<br>資料庫中的學生姓名:"+stu1.getName());		//共有屬性
               out.println("<br>資料庫中的學生學號:"+stu1.getSno());		//特徵屬性
               out.println("<br>資料庫中的學生學校:"+stu1.getSchool());	//特徵屬性
               out.println("<br>");
               
               //新建工人物件
               Worker worker=new Worker();
               worker.setId(new Integer(2));
               worker.setName("李四");
               worker.setAge(new Integer(34));
               worker.setSex("nan");
               worker.setWno("W20152223");
               worker.setSalary(new Double(5435.32));
               //儲存工人物件
               dao.saveWorker(worker);
               //從資料庫中獲取工人物件
               Worker worker2=dao.loadWorker(worker.getId()); //載入子類物件的時候,會使用內連線語句inner join、
               
               out.println("<br>資料庫中的工人姓名:"+worker2.getName());  //共有屬性
               out.println("<br>資料庫中的工人工號:"+worker2.getWno());   //特徵屬性
               out.println("<br>資料庫中的工人工資:"+worker2.getSalary());//特徵屬性
      %>
  </body>
</html>
測試結果:


student表插入的值:

worker表插入的值:


控制檯列印店的HQL

Hibernate: 
    select
        student_.Id,
        student_.Name as Name0_,
        student_.Sex as Sex0_,
        student_.Age as Age0_,
        student_.Sno as Sno1_,
        student_.School as School1_ 
    from
        student student_ 
    where
        student_.Id=?
Hibernate: 
    insert 
    into
        student
        (Name, Sex, Age, Sno, School, Id) 
    values
        (?, ?, ?, ?, ?, ?)
Hibernate: 
    select
        student0_.Id as Id0_0_,
        student0_.Name as Name0_0_,
        student0_.Sex as Sex0_0_,
        student0_.Age as Age0_0_,
        student0_.Sno as Sno1_0_,
        student0_.School as School1_0_ 
    from
        student student0_ 
    where
        student0_.Id=?
Hibernate: 
    select
        worker_.Id,
        worker_.Name as Name0_,
        worker_.Sex as Sex0_,
        worker_.Age as Age0_,
        worker_.Wno as Wno2_,
        worker_.Salary as Salary2_ 
    from
        worker worker_ 
    where
        worker_.Id=?
Hibernate: 
    insert 
    into
        worker
        (Name, Sex, Age, Wno, Salary, Id) 
    values
        (?, ?, ?, ?, ?, ?)
Hibernate: 
    select
        worker0_.Id as Id0_0_,
        worker0_.Name as Name0_0_,
        worker0_.Sex as Sex0_0_,
        worker0_.Age as Age0_0_,
        worker0_.Wno as Wno2_0_,
        worker0_.Salary as Salary2_0_ 
    from
        worker worker0_ 
    where
        worker0_.Id=?




相關推薦

hibernate繼承關係對映方法--每個具體TPC

TPC:所謂是“每個具體類一張表(table per concrete class)”的意思是:使繼承體系中每一個子類都對應資料庫中的一張表。每一個子類對應的資料庫表都包含了父類的資訊,並且包含了自己獨有的屬性。每個子類對應一張表,而且這個表的資訊是完備的,即包含了所有從父

hibernate繼承關係對映方法()--共享

對於如下關係: Person.java package com.hust.PO; public class Person { private Integer id; private String name; private Integer

Hibernate對映繼承每個帶有聯合的具體(每個子,共用一個父對映檔案)

pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocat

Hibernate對映繼承每個帶有隱式多型的具體(每個子,有各自的對映檔案)

Hibernate對映類繼承之每個帶有隱式多型的具體類一張表(每個子類各一張表) 我們可以準確地給每個子類使用一張表。子類的所有屬性,包括被繼承的屬性,都可以被對映到這張表的列。如圖:                         CreditCard子類   -----&

我的學習方法

-- 思考 簡單 繼續 裏的 學校 是否 藝術學院 無法 之前說過放假要好好整理一些東西,今天有空就來寫一篇日誌吧。 最近是高考結束後學弟學妹們選專業,確定學校的日子了,雖然現在寫好像有點過時了,很多人專業什麽都已經定了,但是沒辦法,到現在才把腦

python selenium系列常用操作型及方法

term src 依次 and cto color 自動化 off value 一 前言開展WEB UI自動化的核心思路,無非就是找到元素,然後操作元素這兩個內容。在python selenium系列(二)元素定位方式一文中,已經介紹了如何找到元素這項技能,本文將介紹第二項

解釋機器學習模型的一些方法——理解復雜的機器學習模型

p s 結果 origin 得出 驗證 場景 這樣的 機器 發的 在這一部分中我們所要展現的技術,可以為非線性、非單調的響應函數生成解釋。我們可以把它們與前兩部分提到的技巧結合起來,增加所有種類模型的可解釋性。實踐者很可能需要使用下列增強解釋性技巧中的一種以上,為他們手中

spring-boot-2.0.3不一樣系列之源碼篇 - run方法之createApplicationContext,絕對有值得你看的地方

處理 gen 利用反射 mva 默認 .get war close -s 前言   此系列是針對springboot的啟動,旨在於和大家一起來看看springboot啟動的過程中到底做了一些什麽事。如果大家對springboot的源碼有所研究,可以挑些自己感興趣或者對自己有

Java基礎之繼承方面的學習

上面的博文已經寫了大部分了,下面這一篇博文我們主要寫繼承之後,父類和子類的方法的覆蓋和隱藏方面。 該文章版署源自:                         &n

run方法之createApplicationContext,絕對有值得你看的地方

前言   此係列是針對springboot的啟動,旨在於和大家一起來看看springboot啟動的過程中到底做了一些什麼事。如果大家對springboot的原始碼有所研究,可以挑些自己感興趣或者對自己有幫助的看;但是如果大家沒有研究過springboot的原始碼,不知道springboot在啟動過程中做了些什

一般專案常用效能調優方法

靜態檔案優化靜態檔案優化主要是指對檔案大小的優化。檔案大小往往被很多開發人員忽略,但對於頻寬有限(公網專案)或者硬體裝置(主要是交換機)老舊的環境,檔案大小往往是效能的最大瓶頸。試想一個index.ac

【筆記】計算機的運算方法

四、浮點四則運算   機器中的任何一個浮點數可以寫成x=Sx⋅rjxx=Sx⋅rjx的形式。其中SxSx為浮點數的尾數,一般為絕對值小於1的規格化數(補碼錶示時允許為-1),機器中可用原碼或補碼錶示;jxjx為浮點數的階碼,一般為整數,機器中大多用補

使用Python進行層次聚——層次聚簇間自然分割方法和評價方法

簇間自然分割方法 今天,主要研究一下層次聚類在進行資料運算的時候,對資料結果進行自然簇分離而需要分析的API————inconsistent()。該函式是計算層次聚類不一致係數的,不一致係數越大,表明使用該閾值進行聚類的偏差越大。這樣按照該不一致係數下的閾值進

淺談自考學習方法

        中國的教育教育的學生,考試追求滿分,做事追求完美,這是大錯特錯的做法。         看一本書,用20﹪的精力,獲得80﹪的知識,比用100﹪的精力獲得滿分,有著不言而喻的天壤之別,

學習JBPM 工作流引擎 API方法

繼續介紹使用JBPM的API中的方法來演示一個完整的工作流程需要到那些的方法。      建立類ProcessExecution繼續來測試方法  ProcessExecution類 package cn.itcast.jbpm.c_p

Unity中自動尋路的幾種方法

    現在的大部分mmo遊戲都有了自動尋路功能。點選場景上的一個位置,角色就會自動尋路過去。中間可能會有很多的障礙物,角色會自動繞過障礙物,最終達到終點。使用Unity來開發手遊,自動尋路可以有很多種實現方式。第一種比較傳統的是使用A星尋路,它是一種比較傳統的人工智慧演算

Android Git與sourcetree使用方法本地專案直接推到遠端碼雲中國github

建立遠端專案(碼雲) 這篇文章已經提到了如何建立 本地專案拉入SourceTree 點選左邊空白部分右鍵新建倉庫 本地專案建立遠端倉庫 URL /

系統學習機器學習之引數方法

1判別模型與生成模型 上篇報告中提到的迴歸模型是判別模型,也就是根據特徵值來求結果的概率。形式化表示為,在引數確定的情況下,求解條件概率。通俗的解釋為在給定特徵後預測結果出現的概率。 比如說要確定一隻羊是山羊還是綿羊,用判別模型的方法是先從歷史資料中學習到模型,然後通過提

列舉:列舉中幾個常用的方法

列舉類中的幾個常見方法 int compareTo(E o) String name() int ordinal() String toString() <T> T valueOf(Class<T> type,String name) values(

Android實際開發中的bug總結與解決方法

使用BitmapFactory.Options設定inSampleSize就可以縮小圖片。屬性值inSampleSize表示縮圖大小為原始圖片大小的幾分之一。如果知道圖片的畫素過大,就可以對其進行縮小。 那麼如何才知道圖片過大呢? 方法是:使用BitmapFactory.Options設定inJust