【详解】Hibernate 继承映射

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

下面我们来说说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>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值