hibernate继承关系映射方法(三)--每个具体类一张表TPC
TPC:所謂是“每個具體類一張表(table per concrete class)”的意思是:使繼承體系中每一個子類都對應(yīng)數(shù)據(jù)庫中的一張表。每一個子類對應(yīng)的數(shù)據(jù)庫表都包含了父類的信息,并且包含了自己獨(dú)有的屬性。每個子類對應(yīng)一張表,而且這個表的信息是完備的,即包含了所有從父類繼承下來的屬性映射的字段。這種策略是使用<union-subclass>標(biāo)簽來定義子類的。
注意:三個類+一個父類映射文件+兩張表
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; //學(xué)號private String school; //學(xué)校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. 具體的,實(shí)際的) --> <!-- 每一個具體類一張表 --> <!-- 虛擬選項(xiàng)為'true' --> <class name="Person" table="person" abstract="true"> <!-- 多設(shè)置一個屬性abstract="true",因?yàn)楦揪蜎]有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>標(biāo)簽是用于指示出該hbm文件所表示的類的子類,如Person類有兩個子 類,就需要兩個<union-subclass>標(biāo)簽以此類推。
<union-subclass>標(biāo)簽的"name"屬性用于指 定子類的全限定名稱,"table"屬性用于指定該子類對應(yīng)的表的名稱,"extends"屬性用于指定該子類的父類,
注意:"extends"屬性與<union-subclass>標(biāo)簽的位置有關(guān),若<union-subclass>標(biāo)簽作為<class>標(biāo)簽的子標(biāo)簽,則"extends"屬性可以不設(shè)置,否則需要明確設(shè)置"extends"屬性。
<class>標(biāo)簽中的"abstract"屬性如果值為true則,不會生成表結(jié)構(gòu)。如果值為false則會生成表結(jié)構(gòu),但是不會插入數(shù)據(jù)。
數(shù)據(jù)庫文件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 {//保存學(xué)生信息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("添加學(xué)生信息失敗");}finally{HibernateSessionFactory.closeSession();}}/*session.saveOrUpdate(stu);控制臺打印的HQL* Hibernate: selectstudent_.Id,student_.Name as Name0_,student_.Sex as Sex0_,student_.Age as Age0_,student_.Sno as Sno1_,student_.School as School1_ fromstudent student_ wherestudent_.Id=? Hibernate: insert intostudent(Name, Sex, Age, Sno, School, Id) values(?, ?, ?, ?, ?, ?) *///加載學(xué)生信息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("加載學(xué)生信息失敗");}finally{HibernateSessionFactory.closeSession();}return stu;}/* stu=(Student)session.get(Student.class, id);控制臺打印的HQLHibernate: selectstudent0_.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_ fromstudent student0_ wherestudent0_.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: selectworker_.Id,worker_.Name as Name0_,worker_.Sex as Sex0_,worker_.Age as Age0_,worker_.Wno as Wno2_,worker_.Salary as Salary2_ fromworker worker_ whereworker_.Id=?Hibernate: insert intoworker(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: selectworker0_.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_ fromworker worker0_ whereworker0_.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的繼承關(guān)系(三)每個具體類一張表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的繼承關(guān)系(三)--每個具體類一張表TPC</h2><hr><%//新建學(xué)生對象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("華中科技大學(xué)");//保存stu對象TableDao dao=new TableDao();dao.saveStu(stu);//從數(shù)據(jù)庫中獲取stu對象Student stu1=dao.loadStu(stu.getId()); //加載子類對象out.println("<br>數(shù)據(jù)庫中的學(xué)生姓名:"+stu1.getName()); //共有屬性out.println("<br>數(shù)據(jù)庫中的學(xué)生學(xué)號:"+stu1.getSno()); //特征屬性out.println("<br>數(shù)據(jù)庫中的學(xué)生學(xué)校:"+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);//從數(shù)據(jù)庫中獲取工人對象Worker worker2=dao.loadWorker(worker.getId()); //加載子類對象的時候,會使用內(nèi)連接語句inner join、out.println("<br>數(shù)據(jù)庫中的工人姓名:"+worker2.getName()); //共有屬性out.println("<br>數(shù)據(jù)庫中的工人工號:"+worker2.getWno()); //特征屬性out.println("<br>數(shù)據(jù)庫中的工人工資:"+worker2.getSalary());//特征屬性%></body> </html> 測試結(jié)果:
student表插入的值:
worker表插入的值:
控制臺打印店的HQL
總結(jié)
以上是生活随笔為你收集整理的hibernate继承关系映射方法(三)--每个具体类一张表TPC的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate继承关系映射关系方法(
- 下一篇: hibernate的3种继承映射关系总结