hibernate继承之一,单表继承映射
对象有继承,而对于数据结构来说,如何在映射中体现这种关系。借助hibernate,我们在对表的映射中能够体现这种关系和设计。
相信我们在设计表的时候经常有这种情况,会用一个type字段来表示这张表的两种形式。而反映到java对象中,其实应该是两个对象,不过有很多相同的共同属性。但实际一般来说都会只用一个类,在查询是用type指定值来分辨。
hibernate提供了一种继承的映射来实现这种对象的继承关系。
以合同表举例,比如我分为A类合同和B类合同,逻辑处理并不一样,但数据结构基本是相同的,可能只有1-2个字段不相同,这种情况可以使用hibernate三种继承中的一种,个人觉得这种的使用情况会比较多。因为这种情况不会涉及到多表联查。
设计三个类,合同,A类合同,B类合同。type字段进行区分,0为A,1为B。type用int类型还是用string类型,在hbm文件中区别。hbm文件如下
<?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> <class name="合同类" table="TB_CONTRACT" discriminator-value="not null" <!--如果区别字段是整数类型,则需要声明辨别值不为NULL,如果是string类型,则不必加入这句--> > <id name="id" type="long" column="ID" > <generator class="native" /> </id> <!-- 用该字段作为辨别,用元素discriminator--> <discriminator column="CONTRACT_TYPE" type="int" ></discriminator> <property name="contractName" type="java.lang.String" column="CONTRACT_NAME" /> <property name="levelLink" type="java.lang.String" column="LEVEL_LINK" /> <property name="code" type="java.lang.String" column="CODE" not-null="true" unique="true" /> <!-- bi-directional one-to-many association to LkPmContractItem --> <set name="lkPmContractItems" lazy="true" inverse="true" cascade="none" > <key> <column name="CONTRACT_ID_FK" /> </key> <one-to-many class="com.qeweb.lonking.pm.contract.bo.PmContractItemBO" /> </set> <!-- 最后用subclass声明子类,discriminator-value属性指定对应的值 --> <subclass name="A合同类名" discriminator-value="0"> </subclass> <subclass name="B合同类名" discriminator-value="1"> </subclass> </class> </hibernate-mapping>
至此,Hibernate关于单表映射成继承关系就完成了。
另外,如果你对于子类有分别需要映射的字段,那么需要在<subclass></subclass>中添加。
关键字:discriminator-value,discriminator,subclass
如果需要在父类中仍然要使用类型字段,需要在此字段的声明上加入
insert=false,update=false才可以。