前面的《Eclipse快速上手Hibernate--1. 入门实例 》等三篇文章已经谈了Hibernate的入门以及利用工具创建的方法。这篇文章主要说说在Hibernate中的继承映射。相关配置请参考前三篇文章。
如果程序中的对象含有继承的关系,在Hibernate中有以下三种策略将这种关系映射到数据表上:
· 每个类层次结构一个表(table per class hierarchy)
· 每个子类一个表(table per subclass)
· 每个具体类一个表(table per concrete class)(有一些限制)
· 每个具体类一个表(table per concrete class)(有一些限制)
每个类层次结构一个表的方式是将所有继承同一父类别的对象储存在同一个表格中,为了做到这一点,需要在表格中使用识别字段来表示某一列(row)是属于某个子类别或父类别,在这个主题中我们将先说明这个方法。
1. 创建项目
· 新建一个Java项目:InheritanceMapping,注意选中“创建单独的源文件夹和输出文件夹”,同时添加“用户库”:hibernate。
2. 编写类文件
· 新建一个类,包名:javamxj.inheritance.one,类名:Animal。然后在生成的代码中添加变量,再利用“生成 Getter 和 Setter”,具体方式同《Eclipse快速上手Hibernate--1. 入门实例 》文章中的编辑User.java的方式一样。
Animal.java
/* * Hibernate - 继承映射(每个类层次一个表) * 创建日期 2005-4-9 * @author javamxj(分享java快乐) * @link Blog: htpp://javamxj.mblogger.cn * htpp://blog.csdn.net/javamxj/ */package javamxj.inheritance.one;/** * @hibernate.class * table="Animal" * discriminator-value="Animal" * @hibernate.discriminator * column="ANIMAL_TYPE" * type="string" * length = "10" */public abstract class Animal { private Long id; private String name; /** * @hibernate.id * column="ID" * generator-class="hilo" * unsaved-value="null" */ public Long getId() { return id; } public void setId(Long id) { this.id = id; } /** * @hibernate.property * length = "24" */ public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void makeSound();}
· 这个类是父类,值得注意是在类层次标记中添加了一个discriminator标记,并用它定义了一个字段“ANIMAL_TYPE”,这个字段就是用来识别某一列(row)是属于某个子类别或父类别的。
· 子类Cat.java
|
Cat.java |
package javamxj.inheritance.one;/** * @hibernate.subclass * discriminator-value="Cat" */public class Cat extends Animal { private String FurColor; public void makeSound() { System.out.println("喵喵"); } /** * @hibernate.property * length = "24" */ public String getFurColor() { return FurColor; } public void setFurColor(String furColor) { FurColor = furColor; }} |
· 子类Dog.java
|
Dog.java |
package javamxj.inheritance.one;/** * @hibernate.subclass * discriminator-value="Dog" */public class Dog extends Animal { private String category; public void makeSound() { System.out.println("汪汪"); } /** * @hibernate.property * length = "24" */ public String getCategory() { return category; } public void setCategory(String category) { this.category = category; }} |
· 这两个子类都很简单,注意添加的hibernate.subclass的标记,指定其识别字段。






