Hibernate 之单表继承映射策略

来源:互联网 发布:ubuntu取消挂载命令 编辑:程序博客网 时间:2024/03/29 18:31

1、知识点:

继承实现的三种策略:

一、单表继承:每棵类继承树使用一个表(table per class hierarchy)

  重点关注这个:原因,常用;便于查询,性能好。

二、具体表继承

三、类表继承

2、单表继承:

动物、狗、猪

示例代码如下:

public class Animal {private int id;private String name;
public class Dog extends Animal {private Integer height;
public class Pig extends Animal {private Integer weight;

映射文件:

注意:discriminator 不能缺省,必须有,而且放在id和下一个属性中间。默认类型是string类型

<hibernate-mapping><class name="com.shangxuetang.Animal" table="t_animal" discriminator-value="animal"><id name="id"><generator class="native"/></id>    <discriminator column="animaltype"></discriminator><property name="name"></property><subclass name="com.shangxuetang.Dog" discriminator-value="dog">   <property name="height"></property></subclass><subclass name="com.shangxuetang.Pig" discriminator-value="pig">   <property name="weight"></property></subclass></class></hibernate-mapping>

测试代码:

public void  testOneTable() {Session session = HibernateUtil.getSession();try {session.beginTransaction();Animal a = new Animal();a.setName("X");session.save(a);Dog d = new Dog();d.setName("gou");session.save(d);Pig p = new Pig();p.setName("zhu");session.save(p);session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {session.close();}}

执行之后表内容如下:


3、单表继承查询:

public void  testOneTable() {Session session = HibernateUtil.getSession();try {session.beginTransaction();Animal a = (Animal)session.get(Animal.class, 1);//语句1Animal b = (Animal)session.get(Animal.class, 2);//语句2Animal c = (Animal)session.get(Animal.class, 3);//语句3System.out.println(a.getName());System.out.println(b.getName());System.out.println(c.getName());session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {session.close();}}

语句2如果换成如下:就会报类型转换异常,因为load是加载的一个代理对象。get是没问题的。

Dog b = (Dog)session.load(Animal.class, 2);//语句2