hibernate繼承關係對映方法(三)--每個具體類一張表TPC
TPC:所謂是“每個具體類一張表(table per concrete class)”的意思是:使繼承體系中每一個子類都對應資料庫中的一張表。每一個子類對應的資料庫表都包含了父類的資訊,並且包含了自己獨有的屬性。每個子類對應一張表,而且這個表的資訊是完備的,即包含了所有從父類繼承下來的屬性對映的欄位。這種策略是使用<union-subclass>標籤來定義子類的。
注意:三個類+一個父類對映檔案+兩張表
student表
worker表
測試工程:
Person.java
Student.javapackage 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; } }
Worker.javapackage 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; } }
父類對映檔案Person.hbm.xmlpackage 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; } }
<?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