Hibernate 中支持3中类型的继承方式:
下面需要用到类:
public TItem{
public Integer id;
public String manufacturer;
public String name;
}
public TBook extends TItem{
public String pageCount;
}
public TDVD extends TDVD{
public Integer regionCode;
}
1.表和子类之间的独立的一对一关系。
为每一个子类都建立一个表,同时建立对用的hbm.xml文件,上面的类而言,继承的作用不过是增加了几个共同的字段而已;
2.Table per subclass
数据库中维护三个表;分别为T_ITEM,T_BOOK,T_DVD;对于每一个表只有自己的属性,两个字表通过主键/外键与父表相连。这样值需要写父类的hbm.xml映射文件即可如下:
TItem.hbm.xml
<hibernate-mapping>
<class name="com.redsage.entity.TItem" table="T_ITEM">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name" type="string"/>
<property name="manufacturer" column="manufacturer" type="string">
<joined-subclass name="TDVD" table="T_DVD">
<key column="id"/>
<property name="regionCode" column="regioncode"/>
</join-subclass>
<joined-subclass name="TBook " table="T_BOOK">
<key column="id"/>
<property name="pageCount" column="pageCount"/>
<joined-subclass>
</class>
</hibernate-mapping>
下面为测试用例
TBook book = new TBook();
book.setPageCount(288);
book.setName("NO excuse");
book.setMnaufacturer("Wiley");
TDVD dvd= new TDVD ();
book.setRegionCode("6");
book.setName("Spider Man");
book.setMnaufacturer("Colonbia");
try{
Transaction ts = session.openTransaction();
ts.save(book);
ts.save(dvd);
ts.commit()
}catch(HibernateException e){
e.printStackTrace();
}
//查询语句
List list = session.createQuery("from TItem").list();
Iterator it = list.iterator();
while(it.hasNext()){
TItem item = (TItem)it.next();
System.out.pritln(item.getName());
}
3 Table per class hierarchy
在一个表中同时保存子类新增的属性,并新增一个字段(category)表示这条语句是DVD 的还是BOOK 的;表中的字段如下图:
如何把一个表中不中不同的数据映射到不同的子类中,需要如下的映射文件
TItem.hbm.xml:
<hibernate-mapping>
<class name="com.thq.tt.TItem" table="T_ITEM">
<id name ="id" column="id">
<generator class="native"/>
</id>
**<discriminator column="category" type="string"/>**
<property name="manufacturer" ..>
<..name>
<subclass name="com.thh.t.TBook" discriminator-value="1">
<property name="pageCount" column="pageCount">
</subclass>
<subclass name="com.thh.t.TDVD" discriminator-value="2">
<property name="regionCode" column="regionCode">
</subclass>
</class>
</hibernate-mapping>