实体层次设计

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 的;表中的字段如下图:
表T_Item

如何把一个表中不中不同的数据映射到不同的子类中,需要如下的映射文件
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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值