使用继承映射的前提是,项目不先设计数据库,而是先设计pojo类,再根据pojo生成数据库表,同时pojo中必须出现继承关系,
Hibernate的继承映射
。这里按照这种继承关系设计以下几个类:
1) 父类:Person,建议使用抽象类
a) 属性
i. Id
ii. Name
iii. age
2) 子类:
a) Student
i. School
ii. score
b) Worker
i. 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) 优点:标准范式,容易扩展
e) 缺点:代码实现难度大,多表关联操作过多。
2) 两张表:
a) Student
i. Id
ii. Name
iii. Age
iv. School
v. score
b) Worker
i. Id
ii. Name
iii. Age
iv. Sal
c) 优点:代码相对简单,相对容易扩展
d) 缺点:完全没有体现继承关系,查询所有数据比较麻烦
3) 一张表
a) Person
i. Id
ii. Name
iii. Age
iv. School
v. Score
vi. Sal
vii. Type
b) 优点:代码最简单
c) 缺点:不容易扩展和维护。
在这里使用Hibernate实现三张表和一张表的设计。
先建立pojo类。
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;
手工编写Person的映射文件:
先完成三张表形式的映射:
schema="SUNXUN">
schema="SUNXUN">
注意,外键使用
将该映射文件配置到hibernate.cfg.xml中:
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
org.hibernate.dialect.Oracle9Dialect
jdbc:oracle:thin:@localhost:1521:ORCL
oracle.jdbc.OracleDriver
加入后,可以编写一个生成数据库表的操作:
public class DataBaseUtils {
public static void createTable() {
SchemaExport export = new SchemaExport(HibernateSessionFactory
.getConfiguration());
export.create(true, true);
}
public static void dropTable() {
SchemaExport export = new SchemaExport(HibernateSessionFactory
.getConfiguration());
export.drop(true, true);
}
public static void main(String[] args) {
createTable();
}
}
编写数据库操作时,只需要写Person的操作即可,
电脑资料
《Hibernate的继承映射》(http://meiwen.anslib.com)。public static void main(String[] args) {
// Student s = new Student();
// s.setId("123");
// s.setName("张三");
// s.setAge(23);
// s.setSchool("北航");
// s.setScore(60.0);
// Worker w = new Worker();
// w.setId("abc");
// w.setName("李四");
// w.setAge(33);
// w.setSal(10000.0);
//
// Transaction tx = HibernateSessionFactory.getSession()
// .beginTransaction();
// HibernateSessionFactory.getSession()。save(w);
//
// tx.commit();
String hql = "FROM Person";
System.out.println(HibernateSessionFactory.getSession()
.createQuery(hql)。list());
HibernateSessionFactory.closeSession();
}
如果只使用一张表,只需要修改映射文件即可,程序代码完全不需要修改。