使用继承映射的前提是,项目不先设计数据库,而是先设计pojo类,再根据pojo生成数据库表,同时pojo中必须出现继承关系。
这里按照这种继承关系设计以下几个类:
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的映射文件:
先完成三张表形式的映射:
<?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" not-null="true" /> </property>
<joined-subclass name="org.liky.pojo.Student" table="STUDENT" schema="SUNXUN"> <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> |
注意,外键使用 <key> 来表示 |
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:ORCL
</property>
<property name="connection.username">sunxun</property>
<property name="connection.password">123</property>
<property name="connection.driver_class">
oracle.jdbc.OracleDriver
</property>
<property name="myeclipse.connection.profile">oracle</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping resource="org/liky/pojo/Person.hbm.xml" />
</session-factory>
</hibernate-configuration>
加入后,可以编写一个生成数据库表的操作:
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的操作即可。
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();
}
|
如果只使用一张表,只需要修改映射文件即可,程序代码完全不需要修改。
<?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" not-null="true" /> </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>
|