在Hibernate中,POJO实体类也可以有继承关系。
第一种继承关系为:
Table per concrete class 表与子类独立的一对一关系。
数据库中有3张表,商品表,书本表,影碟表。其中3个表对应3个实体类。3张表没有主外键关系,都有各自的主键,这样每个实体都有各自独立的hbm文件。因为商品表与书本表和影碟表有相同的字段,所以可以设计书本类和影碟类都继承商品类。
这种继承关系比较少见,因为数据库表很少这样设计,也欠缺灵活性。
第二种继承关系为:
Table per subclass 每个子类与父类都对应一张表,但是子类与父类之间有共享的字段,表之间有主外键关系。子表的主键参照父表的主键。
与第一种关系的不同地方在于3个实体类只需要使用一个hbm文件。
TItem.java
public class TItem { private String id ; private String name ; private String manufacturer ; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getManufacturer() { return manufacturer; } public void setManufacturer(String manufacturer) { this.manufacturer = manufacturer; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
TBook.java
public class TBook extends TItem { private int pageCount ; public int getPageCount() { return pageCount; } public void setPageCount(int pageCount) { this.pageCount = pageCount; } }
TDVD.java
public class TDVD extends TItem { private String regionCode ; public String getRegionCode() { return regionCode; } public void setRegionCode(String regionCode) { this.regionCode = regionCode; } }
Titem.hbm.xml
<?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 package="org.lxh.hibernate04"> <class name="TItem" table="TITEM"> <id name="id" column="ID" type="string"> <generator class="assigned" /> </id> <property name="name" column="NAME" type="string" not-null="true" /> <property name="manufacturer" column="MANUFACTURER" type="string" /> <!-- joined-subclass 里面描述的也是TITEM表中的字段,只不过这里面的字段对应的是 另一个子类,里面还需要使用<key>节点指明该子表的所参照的主表外键字段。 --> <joined-subclass name="org.lxh.hibernate04.TBook" table="TBook"> <key column="ID"></key> <!-- 这里也是写上该表的主键字段名 --> <property name="pageCount" type="java.lang.Integer" column="pagecount"></property> </joined-subclass> <joined-subclass name="org.lxh.hibernate04.TDVD" table="TDvd"> <key column="ID"></key> <property name="regionCode" type="java.lang.String" column="regioncode"></property> </joined-subclass> </class> </hibernate-mapping>
第三种继承关系为:
Table per class hierarchy
子类和父类对应一张表。
数据库中实际只存在一张表,表中有类别字段用于区分不同的商品。将每一个类别映射为每个子类实体。
该种关系的POJO类定义与第二种无异,主要区别在于hbm文件
Titem.hbm.xml
<?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 package="org.lxh.hibernate05"> <class name="TItem" table="TITEM"> <id name="id" column="ID" type="string"> <generator class="assigned" /> </id> <!-- discriminator节点用于对类别字段的描述 --> <discriminator column="category" type="java.lang.String"></discriminator> <property name="name" column="NAME" type="string" not-null="true" /> <property name="manufacturer" column="MANUFACTURER" type="string" not-null="true" /> <!-- subclass节点中描述子类中的字段 --> <subclass name="org.lxh.hibernate05.TBook" discriminator-value="1"> <property name="pageCount" column="PAGECOUNT" type="int" /> </subclass> <subclass name="org.lxh.hibernate05.TDVD" discriminator-value="2"> <property name="regionCode" column="REGIONCODE" type="string" /> </subclass> </class> </hibernate-mapping>