继承映射:
1) 每个子类一张表
父类:
Person.java:
private String id;
private String name;
为其生成set、get方法。
子类:
Student.java:
private String cardId;
为其生成set、get方法。
Teacher.java:
private int salary;
为其生成set、get方法。
Student.hbm.xml:
<class name="com.songjinghao.hibernate.Student"table="student">
<id name="id"column="id" type="string">
<generator class="uuid"></generator>
</id>
<property name="name"column="name" type="string"></property>
<property name="cardId"column="cardId" type="string"></property>
</class>
Teacher.hbm.xml:
<class name="com.songjinghao.hibernate.Teacher"table="teacher">
<id name="id"column="id" type="string">
<generator class="uuid"></generator>
</id>
<property name="name"column="name" type="string"></property>
<property name="salary"column="salary" type="integer"></property>
</class>
HibernateTest.java:
// Student student = new Student();
// student.setCardId("123456");
// student.setName("zhangsan");
// Teacher teacher = new Teacher();
// teacher.setSalary(1000);
// teacher.setName("lisi");
// session.save(student);
// session.save(teacher);
//配置文件中没有Person的映射文件,因此需要在类名前加上包名
Query query = session.createQuery("from com.songjinghao.hibernate.Person"); //多态查询
Iterator iter = query.iterate();
while(iter.hasNext())
{
Person p = (Person)iter.next();
System.out.println(p.getName());
}
2) 一张表存储继承体系中所有类的信息(数据库表实际上是继承体系中所有类的属性的并集所构成的字段)
Person.java、Student.java、Teacher.java代码与1)中一样。
Person.hbm.xml:
<class name="com.songjinghao.hibernate.Person"table="person">
<id name="id"column="id" type="string">
<generator class="uuid"></generator>
</id>
<discriminator column="personType"type="string"></discriminator>
<property name="name"column="name" type="string"></property>
<subclass name="com.songjinghao.hibernate.Student"discriminator-value="student">
<property name="cardId"type="string"></property>
</subclass>
<subclass name="com.songjinghao.hibernate.Teacher"discriminator-value="teacher">
<property name="salary"type="integer"></property>
</subclass>
</class>
需要在hbm文件中增加如下一行:
<discriminator column="personType"type="string"></discriminator>
数据库效果图:
HibernateTest.java:
// Student student = new Student();
// student.setCardId("123456");
// student.setName("zhangsan");
// Teacher teacher = new Teacher();
// teacher.setSalary(1000);
// teacher.setName("lisi");
// session.save(student);
// session.save(teacher);
Query query =session.createQuery("from Person"); //多态查询
List list = query.list();
for(int i = 0; i < list.size(); i++)
{
if(list.get(i) instanceof Student)
{
System.out.println(((Student)list.get(i)).getCardId());;
}
if(list.get(i) instanceof Teacher)
{
System.out.println(((Teacher)list.get(i)).getSalary());;
}
}
3) 公共信息放在父类表中,独有信息放在子类表中,每个子类对应
一张表。
Person.java 、 Student.java 、 Teacher.java 代码与 1) 中 一样。Person.hbm.xml:
<class name="com.songjinghao.hibernate.Person"table="person">
<id name="id"column="id" type="string">
<generator class="uuid"></generator>
</id>
<property name="name"type="string"></property>
<joined-subclass name="com.songjinghao.hibernate.Student"table="student">
<key column="id"></key>
<property name="cardId"type="string"></property>
</joined-subclass>
<joined-subclass name="com.songjinghao.hibernate.Teacher"table="teacher">
<key column="id"></key>
<property name="salary"type="integer"></property>
</joined-subclass>
</class>
总结:
第一种方式:一个子类一张表,结构比较清晰。
第二种方式:从简单角度看,此方式只有一张表,配置起来比较简单,不需要多余的表,但是却浪费了数据库空间,如果子类多的情况下,会有大量空的存储。
第三种方式:需要进行表的连接查询,在一定程度上会损耗数据库的性能。
三种方式都有优点也都有缺点,没有哪一种是完美的,视情况使用合适的方式。