先建立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/HibernateMapping 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> 来表示
将该映射文件配置到hibernate.cfg.xml中(和自动生成映射的格式一样)。加入后,可以编写一个生成数据库表的操作。
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>