先说点别的。有人说写程序改异常就像是追女孩子。刚开始写这个程序就像刚见到某个女孩子,你得告诉她你喜欢她啊。于是你第一次去给人家说,结果被拒绝了,此时就像是碰到了程序中的异常,这时不要急,耐心的分析一下问题所在,然后再次去说,被拒绝了再去说...说上那么十几次估计就成了。就算不成,那你也是长了经验了,下次碰到这类问题(异常/女生)你就有经验了,就能很快拿下。如果还是不成功,那只能说明人家女生比你更有经验!
貌似有点道理,不过我异常是改了N多个了,成功率也很高,可是追女孩子却是几乎从未有过...
O(∩_∩)O哈哈~,扯完了,入正题。
假如我现在有Pig类和Bird类,且均继承自Animal类。我现在需要将他们存到数据库中,且各属性均放在一张表中。这样的映射文件该如何写呢?
首先来映射父类Animal类。

<?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="cn.ineeke.entity">
<class name="Animal" table="T_animal">
<id name="id">
<generator class="native"/>
</id>
<property name="name" type="java.lang.String"/>
<property name="sex" type="java.lang.Boolean"/>
</class>
</hibernate-mapping>

之前都是每个类都有其自己的一个映射文件,此次则全都写在同一文件中。接着增加Pig类的映射。由于Pig类是继承自Animal类,所以这里使用标签。

<?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="cn.ineeke.entity">
<class name="Animal" table="T_animal">
<id name="id">
<generator class="native"/>
</id>
<property name="name" type="java.lang.String"/>
<property name="sex" type="java.lang.Boolean"/>
<subclass name="Pig">
<property name="weight" type="java.lang.Integer" />
</subclass>
</class>
</hibernate-mapping>

同理,对Bird类进行映射。可是,这么存储的话,没法分辨出哪条数据是Pig哪条数据是Bird。所以,还需要增加一列type,用来进行类别区分,在映射文件中则需要使用鉴别器标签。同时在各子类中使用discriminator-value属性赋予该类的唯一标识。最终完整配置如下。

<?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="cn.ineeke.entity">
<class name="Animal" table="T_animal">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type" type="java.lang.String"/>
<property name="name" type="java.lang.String"/>
<property name="sex" type="java.lang.Boolean"/>
<subclass name="Pig" discriminator-value="P">
<property name="weight" type="java.lang.Integer" />
</subclass>
<subclass name="Bird" discriminator-value="B">
<property name="height" type="java.lang.Integer"/>
</subclass>
</class>
</hibernate-mapping>

那么数据库中所对应的表结构就应该是下图这样了。

 » 除非另有声明,本站文章均为原创。
 » 转载原创文章请以链接形式注明:
 » 转载自:[Neeke] » [Hibernate单表继承映射]
 » 本文链接地址: http://www.ineeke.com/archives/830/
 » 如果喜欢可以:点此邮件订阅或者点此阅读器订阅