您的位置:首页 > 其它

【详解】Hibernate 继承映射

2014-08-01 18:02 295 查看
其实使用框架,还是很容易的,但是要灵活的使用框架,那就要懂一个框架的整体架构,深入分析原理,你才能做到灵活应用,并且优化。

下面我们来说说Hibernate继承映射

继承映射1:整个继承体系一张表!

解释:顾名思义,所有的类公用一个表,那怎么区分数据是属于哪个子类的呢?很简单:增加一行字段即可,用来标示不同的子类。



带源码分析:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
SYSTEM "file:///E:/第三方开发框架/hibernate/hibernate_dtd/hibernate-mapping-3.0.dtd">
<!-- 继承体系中的所有类公用一张表
优点:查询或者插入的数据快。因为只需要访问一张表
缺点:1,所过子类越来越多,表中的字段越来越庞大,难于维护。再者,这张表混杂的字段太多,对于某个特定的类,很多字段都是对于的
例如相对Student表,那Teacher中的salary字段就是多余的。
2, 子类的字段不能加非空限制!这个很重要!你想想你加了非空限制,你让另外一个子类怎么添加数据?
适用范围:子类数目不要太多了,字段不要太多了,而且你子类中的属性必须没有非空限制!
-->
<hibernate-mapping package="继承体系">
<class name="People" discriminator-value="People">
<id name="id">
<generator class="native" />
</id>
<!-- 这个属性用来区分数据是哪个类型的,具体对应:discriminator-value的值 -->
<discriminator column="class" type="string"/>

<property name="name"/>
<property name="age"/>

<!-- 所有的子类公用一张表 -->
<subclass name="Student" discriminator-value="Student">
<property name=""></property>
</subclass>
<subclass name="Teacher" discriminator-value="Teacher">
<property name="salary"/>
</subclass>

</class>
</hibernate-mapping>

继承映射2:子类共用父类的信息,父类一张表,子类单独创建一张表,表中字段是子类特有的属性。
继承关系图,还是上面那一张.

带源码分析;

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
SYSTEM "file:///E:/第三方开发框架/hibernate/hibernate_dtd/hibernate-mapping-3.0.dtd">
<!-- 子类共用父类的信息,子类单独创建一张表,表中字段是子类特有的属性;
即:父类那张表存放公共信息,子类那张表存放特有属性,然后两者通过外键映射起来。
优点:符合面向对象的思想,层次结构分明。
缺点:不管是插入子类,还是获取子类,效率比较慢,因为要查询两张表!-->
<hibernate-mapping package="继承体系">
<class name="People">
<id name="id">
<generator class="native" />
</id>
<property name="name"/>
<property name="age"/>
<!-- 让子类自己拥有一张表,最大的缺点就是查询的速度略慢,为什么呢?因为你如果要查询子类,那么你就得先查询父类 -->
<joined-subclass name="Student">
<key column="student_Id"/>
<property name="number"/>
</joined-subclass>
<joined-subclass name="Teacher">
<key column="teacherId"/>
<property name="salary" type="java.lang.Integer"/>
</joined-subclass>
</class>
</hibernate-mapping>


继承关系3:混合两种方式

带源码分析:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
SYSTEM "file:///E:/第三方开发框架/hibernate/hibernate_dtd/hibernate-mapping-3.0.dtd">
<!-- 混合方式:优点:让Hibernate的使用者能够自由的组合,非常不错
适用范围:一般做法就将字段很少的子类直接映射在父类表的。-->
<hibernate-mapping package="继承体系">
<class name="People" discriminator-value="People">
<id name="id">
<generator class="native" />
</id>
<!-- 这个属性用来区分数据是哪个类型的,具体对应:discriminator-value的值 -->
<discriminator column="class" type="string" />

<property name="name" />
<property name="age" />

<subclass name="Student" discriminator-value="Student">
<property name="number"></property>
</subclass>

<subclass name="Teacher" discriminator-value="Teacher">
<join table="teacher">
<key column="teacherId" />
<property name="salary" />
</join>
</subclass>
</class>
</hibernate-mapping>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate