爲了將程序領域中的繼承關係反映到數據中,Hibernate爲咱們提供了3中方案:java
一、實體對象數據庫
1.1 父類實體(Person類)session
package demo.entity; /** * 人實體(父類) * @author Don * @date:日期:2017年4月11日 時間:下午4:08:04* * @version 1.0 */ public class Person { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
1.2 子類實體(Student類)app
package demo.entity; import java.util.HashSet; import java.util.Set; /** * 學生實體(子類) * @author Don * @date:日期:2017年4月11日 時間:下午2:25:15* * @version 1.0 */ public class Student extends Person { private String code; public String getCode() { return code; } public void setCode(String code) { this.code = code; } }
1.3 子類實體(Teacher類)ide
package demo.entity; /** * 教師實體(子類) * @author Don * @date:日期:2017年4月11日 時間:下午4:11:08* * @version 1.0 */ public class Teacher extends Person { private String jobTitle; public String getJobTitle() { return jobTitle; } public void setJobTitle(String jobTitle) { this.jobTitle = jobTitle; } }
二、數據庫關係映射配置測試
2.1 父類無表關係配置ui
<?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> <!-- name:實體, table:表名 --> <!-- 每一個具體子類對應一張表,試用<union-subclass>標籤,abstract爲true時標識父類無表 --> <class name="demo.entity.Person" abstract="true"> <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 --> <id name="Id"> <!-- 生成主鍵--> <generator class="uuid"></generator> </id> <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) --> <property name="name" /> <union-subclass name="demo.entity.Student" table="ex_student" extends="demo.entity.Person"> <property name="code"></property> </union-subclass> <union-subclass name="demo.entity.Teacher" table="ex_teacher" extends="demo.entity.Person"> <property name="jobTitle"></property> </union-subclass> </class> </hibernate-mapping>
2.2 整個體系一張表關係配置this
<?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> <!-- name:實體, table:表名 --> <!-- 使用一張表表示全部繼承體系下的類的屬性的並集,使用<discriminator>--> <class name="demo.entity.Person" table="ex_person"> <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 --> <id name="Id"> <!-- 生成主鍵--> <generator class="uuid"></generator> </id> <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) --> <property name="name" /> <!-- 會在ex_person表中生成一個字段,用來標記記錄屬於哪個子類 --> <discriminator column="personType" type="string"></discriminator> <subclass name="demo.entity.Student" discriminator-value="stu"> <property name="code"></property> </subclass> <subclass name="demo.entity.Student" discriminator-value="tea"> <property name="jobTitle"></property> </subclass> </class> </hibernate-mapping>
2.3 每一個類都有表,使用主鍵關聯聯繫配置spa
<?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> <!-- name:實體, table:表名 --> <!-- 使用一張表表示全部繼承體系下的類的屬性的並集,使用<discriminator>--> <class name="demo.entity.Person" table="ex_person"> <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 --> <id name="Id"> <!-- 生成主鍵--> <generator class="uuid"></generator> </id> <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) --> <property name="name" /> <joined-subclass name="demo.entity.Student" table="ex_student"> <!-- 對應學生表的主鍵Id --> <key column="stuid"></key> <property name="code"></property> </joined-subclass> <joined-subclass name="demo.entity.Teacher" table="ex_teacher"> <!-- 對應學生表的主鍵Id --> <key column="teaid"></key> <property name="jobTitle"></property> </joined-subclass> </class> </hibernate-mapping>
三、 測試數據.net
package demo.test; import org.hibernate.classic.Session; import demo.entity.Person; import demo.entity.Teacher; import demo.entity.Student; import demo.util.HibernateUtil; public class TestSave { public static void main(String[] args) { Session session = HibernateUtil.getCurrentSession(); session.beginTransaction(); Student student = new Student(); student.setName("Don"); student.setCode("091449"); Teacher teacher = new Teacher(); teacher.setName("張三"); teacher.setJobTitle("高級教師"); session.save(student); session.save(teacher); //查詢(查詢學生姓名,有繼承關係未指定學生對象,使用其父對象查詢) Person person =(Person)session.get(Person.class, "2c918c7b5b5c1adc015b5c1ae1cb0001"); System.out.println(person.getName()); System.out.println(person.getClass().getName()); session.getTransaction().commit(); } }