繼承關係java
hibernate的繼承關係有三種,分別是:數據庫
說明 |
優勢 |
缺點 |
|
subclass |
父類子類保存在同一張表,經過一個辨別字段區分類型。 |
全部數據都保存在一張表,性能略高。 |
存在多餘的字段。字段必須容許爲null。 |
joined-subclass |
父類子類相同的字段保存在同一張表,子類獨有的字段存在另外一張表。 |
不存在多餘的字段。 |
須要維護的表的數量增多。 |
union-subclass |
父類子類都有獨立的表。 |
關係清晰明確。 |
有多餘的字段,操做時候須要維護多張表,性能不高。 |
介紹完三種關係後,一個一個的進行測試。session
首先來看看subclass是如何實現繼承關係的。下面是兩個類person和student的代碼,student繼承了person,而且添加了一個school屬性:app
package cn.net.bysoft.model1; public class Person { // getter and setter private int id; private String name; }
package cn.net.bysoft.model1; public class Student extends Person { public String getSchool() { return school; } public void setSchool(String school) { this.school = school; } private String school; }
接下來是*.hbm.xml配置文件,使用了discriminator辨別類型節點,而且在class節點中加入了discriminator-value屬性,具體來看下配置文件:性能
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="cn.net.bysoft.model1.Person" table="PERSON" discriminator-value="PERSON"> <id name="id" type="integer" column="ID"> <!-- 指定主鍵的生成方式,native是使用數據庫本地的方式 --> <generator class="native"></generator> </id> <!-- 辨別字段 --> <discriminator column="TYPE" type="string"></discriminator> <property name="name" type="string" column="NAME"></property> <subclass name="cn.net.bysoft.model1.Student" discriminator-value="STUDENT"> <property name="school" type="string" column="SCHOOL"></property> </subclass> </class> </hibernate-mapping>
測試一個save方法,看一看生成的數據表:測試
@Test public void testSubClassSave() { Person person = new Person(); person.setName("Jack"); Student student = new Student(); student.setName("XiaoMing"); student.setSchool("Two"); session.save(person); session.save(student); }
在看看joined-subclass,對象不用改變,save方法也不用修改,只修改一下配置文件便可,不在須要辨別類型,直接加入joined-subclass節點:this
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="cn.net.bysoft.model1.Person" table="PERSON"> <id name="id" type="integer" column="ID"> <!-- 指定主鍵的生成方式,native是使用數據庫本地的方式 --> <generator class="native"></generator> </id> <property name="name" type="string" column="NAME"></property> <joined-subclass name="cn.net.bysoft.model1.Student" table="STUDENT"> <key column="STUDENT_ID"></key> <property name="school" type="string" column="SCHOOL"></property> </joined-subclass> </class> </hibernate-mapping>
最後看一下union-subclass是如何配置的,直接修改配置文件:spa
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="cn.net.bysoft.model1.Person" table="PERSON"> <id name="id" type="integer" column="ID"> <!-- 指定主鍵的生成方式,native是使用數據庫本地的方式 --> <generator class="hilo"></generator> </id> <property name="name" type="string" column="NAME"></property> <union-subclass name="cn.net.bysoft.model1.Student" table="STUDENT"> <property name="school" type="string" column="SCHOOL"></property> </union-subclass> </class> </hibernate-mapping>
這裏注意,使用union-subclass時,父類的主鍵生成方式不能是native。
.net