实体层次设计

来源:互联网 发布:平面图转换立体图软件 编辑:程序博客网 时间:2024/05/14 06:42

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>