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"""> <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);控制台打印的HQLHibernate: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_.idwherestudent_.Sid=?Hibernate:insertintoperson(Name, Sex, Age, id)values(?, ?, ?, ?)Hibernate:insertintostudent(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);控制台打印的HQL 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 join //与person表的Id内连接person student0_1_on student0_.Sid=student0_1_.idwherestudent0_.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);控制台打印的HQLHibernate: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_.idwhereworker_.Wid=?Hibernate:insertintoperson(Name, Sex, Age, id)values(?, ?, ?, ?)Hibernate:insertintoworker(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);控制台打印的HQL 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 join //与person表内连接person worker0_1_on worker0_.Wid=worker0_1_.idwhereworker0_.Wid=?//参数id与worker的表的Wid字段内连接*/}测试页面test.jsp

一个人的期望值越大,心理承受力就会越小,就越经受不住失败的打击,

hibernate继承关系映射关系方法(二)–每个子类一张表

相关文章:

你感兴趣的文章:

标签云: