hibernate继承关系映射关系方法(二)--每个子类一张表
生活随笔
收集整理的這篇文章主要介紹了
hibernate继承关系映射关系方法(二)--每个子类一张表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
TPS:所謂“每個子類一張表(Table Per Subclass)”:父類一張表,每個子類一張表,父類的表保存公共有信息,子類的表只保存自己特有的信息
? ? ?這種策略是使用<joined-subclass>標簽來定義子類的。父類、子類都對應一張數據庫表。在父類對應的數據庫表中,它存儲了所 有記錄的公共信息,實際上該父類對應的表會包含所有的記錄,包括父類和子類的記錄;在子類對應的數據庫表中,這個表只定義了子類中所特有的屬性映射的字 段。
person表
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 Integer sid; //學生標識,與父類person內連接private String sno; //學號private String school; //學校public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}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 Integer wid; //工人標識,與父類person內連接private String wno; //工號private Double salary; //工資public Integer getWid() {return wid;}public void setWid(Integer wid) {this.wid = wid;}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: <joined-subclass>標簽需要包含一個key標簽,這個標簽指定了子類和父類之間是通過哪個字段來內連接的。
<?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"> <!-- Person表 --> <class name="Person" table="person"> <!-- person 表保存公共屬性 --><id name="id"> <!-- 父類的主鍵生成策略為‘分配’ --> <generator class="assigned"></generator> </id> <property name="name" column="Name" type="string"></property> <property name="sex" column="Sex" type="string"></property> <property name="age" column="Age" type="java.lang.Integer"></property> <!-- student表 ,name是類名。table是對應的表名--> <joined-subclass name="Student" table="student"> <key column="Sid"></key> <!-- 指定了子類和父類之間是通過哪個字段來關聯的 ,這里的關聯是內連接--><property column="Sno" name="sno" type="string" ></property> <!-- 子類特征屬性 --><property column="School" name="school" type="string" ></property> <!-- 子類特征屬性 --></joined-subclass> <!-- worker表 --> <joined-subclass name="Worker" table="worker"> <key column="Wid"></key> <property column="Wno" name="wno" type="string" ></property> <!-- 子類特征屬性 --><property column="Salary" name="salary" type="double" ></property> <!-- 子類特征屬性 --></joined-subclass> </class> </hibernate-mapping> 數據庫Dao文件,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 {//保存學生信息,執行段代碼后,student對象的id,name,sex,age會自動保存在person表中,特征屬性sid,sno,school會保存在student表中,person表的Id字段和student表的Sid字段是內連接的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: selectstudent_.Sid,student_1_.Name as Name0_,student_1_.Sex as Sex0_,student_1_.Age as Age0_,student_.Sno as Sno1_,student_.School as School1_ fromstudent student_ inner joinperson student_1_ on student_.Sid=student_1_.id wherestudent_.Sid=? Hibernate: insert intoperson(Name, Sex, Age, id) values(?, ?, ?, ?) Hibernate: insert intostudent(Sno, School, Sid) values(?, ?, ?)*///加載學生信息,過程是參數id與person表內連接,查詢person表的公共字段和student表的特征字段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);控制臺打印的HQLHibernate: selectstudent0_.Sid as id0_0_,student0_1_.Name as Name0_0_,student0_1_.Sex as Sex0_0_,student0_1_.Age as Age0_0_,student0_.Sno as Sno1_0_,student0_.School as School1_0_ fromstudent student0_ inner join //與person表的Id內連接person student0_1_ on student0_.Sid=student0_1_.id wherestudent0_.Sid=? //參數id是student表的Sid字段*///保存工人信息,執行段代碼后,worker對象的id,name,sex,age會自動保存在person表中,特征屬性wid,wno,salary會保存在worker表中,person表的Id字段和worker表的Wid字段是內連接的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_.Wid,worker_1_.Name as Name0_,worker_1_.Sex as Sex0_,worker_1_.Age as Age0_,worker_.Wno as Wno2_,worker_.Salary as Salary2_ fromworker worker_ inner joinperson worker_1_ on worker_.Wid=worker_1_.id whereworker_.Wid=? Hibernate: insert intoperson(Name, Sex, Age, id) values(?, ?, ?, ?) Hibernate: insert intoworker(Wno, Salary, Wid) values(?, ?, ?)*///加載工人信息,過程是參數id與person表內連接,查詢person表的公共字段和woker表的特征字段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);控制臺打印的HQLHibernate: selectworker0_.Wid as id0_0_,worker0_1_.Name as Name0_0_,worker0_1_.Sex as Sex0_0_,worker0_1_.Age as Age0_0_,worker0_.Wno as Wno2_0_,worker0_.Salary as Salary2_0_ fromworker worker0_ inner join //與person表內連接person worker0_1_ on worker0_.Wid=worker0_1_.id whereworker0_.Wid=?//參數id與worker的表的Wid字段內連接 */} 測試頁面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的繼承關系(二)每個子類一張表</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的繼承關系(二)每個子類一張表</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()); //加載子類對象的時候,會使用內連接語句inner joinout.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> 結果:
控制臺打印的HQL:
Hibernate: selectstudent_.Sid,student_1_.Name as Name0_,student_1_.Sex as Sex0_,student_1_.Age as Age0_,student_.Sno as Sno1_,student_.School as School1_ fromstudent student_ inner joinperson student_1_ on student_.Sid=student_1_.id wherestudent_.Sid=? Hibernate: insert intoperson(Name, Sex, Age, id) values(?, ?, ?, ?) Hibernate: insert intostudent(Sno, School, Sid) values(?, ?, ?) Hibernate: selectstudent0_.Sid as id0_0_,student0_1_.Name as Name0_0_,student0_1_.Sex as Sex0_0_,student0_1_.Age as Age0_0_,student0_.Sno as Sno1_0_,student0_.School as School1_0_ fromstudent student0_ inner joinperson student0_1_ on student0_.Sid=student0_1_.id wherestudent0_.Sid=? Hibernate: selectworker_.Wid,worker_1_.Name as Name0_,worker_1_.Sex as Sex0_,worker_1_.Age as Age0_,worker_.Wno as Wno2_,worker_.Salary as Salary2_ fromworker worker_ inner joinperson worker_1_ on worker_.Wid=worker_1_.id whereworker_.Wid=? Hibernate: insert intoperson(Name, Sex, Age, id) values(?, ?, ?, ?) Hibernate: insert intoworker(Wno, Salary, Wid) values(?, ?, ?) Hibernate: selectworker0_.Wid as id0_0_,worker0_1_.Name as Name0_0_,worker0_1_.Sex as Sex0_0_,worker0_1_.Age as Age0_0_,worker0_.Wno as Wno2_0_,worker0_.Salary as Salary2_0_ fromworker worker0_ inner joinperson worker0_1_ on worker0_.Wid=worker0_1_.id whereworker0_.Wid=?
總結
以上是生活随笔為你收集整理的hibernate继承关系映射关系方法(二)--每个子类一张表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate插入Mysql数据库出
- 下一篇: hibernate继承关系映射方法(三)