Hibernate继承关系映射(了解),实现反向生成数据库表的过程

一、继承关系映射(了解)

使用这种映射的前提是先设计java的pojo类,同时类中出现了继承关系,反向生成数据库表时,才有可能会出现。

为什么会有这一反向生成表的想法呢?

因为java是面向对象,你先生成表的就是说你把关系写死了,这样肯定不合适。所以就有人提出了反向生成数据库表的想法。但是由于我们开发人员一直是从表的建立开始编码的,这更符合开发的逻辑,所以反向生成表一直没得到广泛应用。

这里设计三个类,包含继承关系,来完成继承关系映射(只有类才包含继承关系)。

1)  父类:Person,抽象类

a)         属性:

                        i.             Id:身份证号

                        ii.             Name:姓名

                        iii.             Age:年龄

2)  子类:Student,Worker

a)         Student:

                        i.             特有属性

1.         School

2.         Score

b)        Worker:

                        i.             特有属性

1.         Sal

根据类,反过来设计表,表怎样设计?

1)  三张表

a)         Person

                        i.             字段

1.         Id,主键

2.         Name

3.         age

b)        Student

                        i.             字段

1.         Id,主键,外键

2.         School

3.         score

c)         worker

                        i.             字段

1.         Id,主外键

2.         Sal

d)        优点

                        i.             标准范式,结构清楚,容易扩展

e)         缺点

                        i.             代码编写比较复杂,所有操作都跨多张表完成。

2)  两张表(这种方式设计完全没有体现继承方式,所以不用来反向生成表)

a)         Student

                        i.             Id

                        ii.             Name

                        iii.             Age

                        iv.             School

                        v.             score

b)        Worker

                        i.             Id

                        ii.             Name

                        iii.             Age

                        iv.             Sal

c)         优点

                        i.             代码相对简单,容易扩展

d)        缺点

                        i.             查询所有人时,需要多次查询数据库。

3)  一张表

a)         字段

                        i.             Id

                        ii.             Name

                        iii.             Age

                        iv.             School

                         v.             Sal

                         vi.             Score

                         vii.             Type

b)        优点:

                        i.             代码非常简单

c)         缺点

                        i.             如果扩展,代码修改的量比较大。


1.1创建项目,加入Hibernate支持,然后在MyEclipse中编写好pojo类,get/set一下。

public abstract class Person {
	private String id;
	private String name;
	private Integer age;  }
public class Student extends Person {
	private String school;
	private Double score;
}
public class Worker extends Person {
	private Double sal;
}

由于反向生成表,Hibernate不清楚表与表之间的关系,所以需要手工完成一个映射文件,描述表该怎样生成。

只写Person类的映射,子类的映射在该映射文件中体现出来。(这里使用的是三张表的形式)

<?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>
	<class name="org.liky.pojo.Person" table="PERSON" schema="SUNXUN">
		<id name="id" type="java.lang.String">
			<column name="ID" length="18" />
			<generator class="assigned" />
		</id>
		<property name="name" type="java.lang.String">
			<column name="NAME" length="20" not-null="true" />
		</property>
		<property name="age" type="java.lang.Integer">
			<column name="age" precision="3" />
		</property>
		<!-- 
			三张表的配置
		-->
		<joined-subclass name="org.liky.pojo.Student" table="STUDENT"
			schema="SUNXUN">
			<!-- 
				子表与父表之间需要通过外键来关联,这里使用<key>来表示外键.
			-->
			<key>
				<column name="ID"></column>
			</key>
			<property name="school" type="java.lang.String">
				<column name="SCHOOL" length="100"></column>
			</property>
			<property name="score" type="java.lang.Double">
				<column name="SCORE" precision="5" scale="2"></column>
			</property>
		</joined-subclass>
		<joined-subclass name="org.liky.pojo.Worker" table="WORKER"
			schema="SUNXUN">
			<key>
				<column name="ID"></column>
			</key>
			<property name="sal" type="java.lang.Double">
				<column name="SAL" precision="8" scale="2"></column>
			</property>
		</joined-subclass>
	</class>
</hibernate-mapping>
将这个映射文件的位置,配置到hibernate.cfg.xml中。

最后,编写代码,反向生成数据库表。创建一个DataBaseUtil类

public class DataBaseUtils {
	public static void createTable() {
		// 使用一个导出数据的类
		SchemaExport export = new SchemaExport(HibernateSessionFactory
				.getConfiguration());
		export.create(true, true);
	}

	public static void main(String[] args) {
		createTable();
	}
}
执行该方法,即在数据库刷新出这三张表。

生成一张表的情况:需要修改映射文件;

<?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>
	<class name="org.liky.pojo.Person" table="PERSON" schema="SUNXUN">
		<id name="id" type="java.lang.String">
			<column name="ID" length="18" />
			<generator class="assigned" />
		</id>
		<!-- 
			声明一个标识位,该值自动添加,根据传入的类型不同,自动加入不同的值
		-->
		<discriminator type="string">
			<column name="type" length="10"></column>
		</discriminator>
		<property name="name" type="java.lang.String">
			<column name="NAME" length="20" not-null="true" />
		</property>
		<property name="age" type="java.lang.Integer">
			<column name="age" precision="3" />
		</property>

		<!-- 
			加入一张表的继承配置
		-->
		<subclass name="org.liky.pojo.Student" discriminator-value="学生">
			<property name="school" type="java.lang.String">
				<column name="SCHOOL" length="100"></column>
			</property>
			<property name="score" type="java.lang.Double">
				<column name="SCORE" precision="5" scale="2"></column>
			</property>
		</subclass>

		<subclass name="org.liky.pojo.Worker" discriminator-value="工人">
			<property name="sal" type="java.lang.Double">
				<column name="SAL" precision="8" scale="2"></column>
			</property>
		</subclass>

	</class>
</hibernate-mapping>
下面的都是一样的,不详细说明。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值