hibernate的继承映射(xml版)

所有子类映射到一张表(1张表)

UML图
在这里插入图片描述
(1)实体类

public class Person {

	//使用uuid,必须是String类型,int类型不支持
	private Integer pid;
	private String name; 
	//省了get/set
}
public class Programmer extends Person {

	private String NotebookName;//笔记本名称
	//省了get/set
public class Student extends Person{

	private String score;
	//省了get/set
}

(2)配置映射文件

	<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="cn.itcast.extendsMapping.Person" table="t_person">
		<id name="pid">
			<generator class="native"></generator>
		</id>
		<discriminator column="type_"></discriminator>
		<property name="name" column="name"></property>
		
		<subclass name="cn.itcast.extendsMapping.Programmer"
				  discriminator-value="_programmer">
			<property name="NotebookName" column="NotebookName"></property>
		</subclass>
		
		<subclass name="cn.itcast.extendsMapping.Student"
		 		  discriminator-value="_student">
			<property name="score" column="score"></property>
		</subclass>
	</class>
</hibernate-mapping>

(3)引入到核心配置文件:hibernate.cfg.xml
(4)运行代码测试
(5)生成的记录
在这里插入图片描述
(6)对映射文件的描述
在这里插入图片描述
(7)好处和弊端
什么情况下使用:子类比较多,并且子类的属性比较少
好处:因为使用一个映射文件,减少了映射文件的个数
弊端:不符合数据库设计原则,不太推荐使用

每个类映射到一张表(3张表)

还是以上面为例子,不同的只有映射文件
(1)映射文件:使用joined-subclass标签

	<!--每个类映射到一张表  -->
	<class name="cn.itcast.extendsMapping.Person" table="t_person">
		<id name="pid">
			<generator class="native"></generator>
		</id>
		<property name="name" column="name"></property>
		
		<!--
			key: 指定t_programmer表的外键字段	,指向t_person表的主键	
		  -->
		<joined-subclass name="cn.itcast.extendsMapping.Programmer"
						 table="t_programmer">
			<key column="t_person_fk"></key>
			<property name="NotebookName" column="NotebookName"></property>
		</joined-subclass>
		
		<!--
			key: 指定t_student表的外键字段,指向t_person表的主键	
		  -->
		<joined-subclass name="cn.itcast.extendsMapping.Student"
						 table="t_student">
			<key column="t_person_fk"></key>
			<property name="score" column="score"></property>
		</joined-subclass>
		
	</class>

(3)引入到核心配置文件:hibernate.cfg.xml
(4)运行代码测试
(5)生成的记录
在这里插入图片描述
(7)弊端
表结构比较复杂,如果想在子表中插入一条数据,需要执行两条sql,往父类中插入记录,还要往子类中插入数据

每个子类对应一张表,父类不对应(2张表)

还是以上面为例子,不同的只有映射文件和实体类:
需要注意:使用这个继承映射的时候,主键的增长策略不能是自增长
即generator class=“native”> 不能是native,而应该改成
uuid,但如果改成了uuid,那么类型必须为String类型
(1)映射文件:使用union-subclass标签

	<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<!--
		因为最终生成的t_person什么内容也没有,所以我想去除它
		有人说不指定table属性值,那么它默认会用你的类名来做表名
		应该使用abstract="true": 指定实体类对象不生成表
	  -->
	<class name="cn.itcast.extendsMapping.Person" abstract="true">
		<id name="pid">
			<generator class="uuid"></generator>
		</id>
		<property name="name" column="name"></property>
		
		<!--
			每个表都需要主键,而t_programmer表最终生成的时候,
			会从t_person中将pid作为自己的主键
		  -->
		<union-subclass name="cn.itcast.extendsMapping.Programmer"
						table="t_programmer">
						
			<property name="NotebookName" column="NotebookName"></property>
		</union-subclass>
		
		<union-subclass name="cn.itcast.extendsMapping.Student"
						table="t_student">
						
			<property name="score" column="score"></property>	
		</union-subclass>
		
	</class>
</hibernate-mapping>

(3)引入到核心配置文件:hibernate.cfg.xml
(4)运行代码测试
(5)生成的记录
在这里插入图片描述
最后:推荐使用这种,比较符合数据库的设计原则,而且也不会有一些繁琐的主外键关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值