Hibernate的继承映射:
1,一个继承结构一张表,通过鉴别器区分记录属于哪个子类
2,基类一张表,每个子类一张表,基类存放公共属性,子类存放扩展属性
3,基类无表,每个子类一张表,存放所有属性
一,XML配置
参考:http://www.blogjava.net/Tower/archive/2005/03/02/1617.html
假设我们有四个类Animal,Dog,Cat,其代码如下:
文件名:Animal.java
class Animal {
}
文件名:Dog.java
class Dog extends Animal {
}
文件名:Cat.java
class Cat extends Animal {
}
1,一个继承结构一张表:限制就时子类不能有NOT NULL属性
2,基类一张表,每个子类一张表:可以使用一个映射文件实现,也可以分成多个映射文件来实现
3,基类无表,每个子类一张表:每一个子类的映射文件将要包含所有父类中的属性
二,注解配置
1,一个继承结构一张表
java代码:
@Entity
@Table(name = "category_single")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype", discriminatorType = DiscriminatorType.STRING)
public class BaseCategorySingle {
private Integer id;
private String name;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
public Integer getId() {
return id;
}
@Column(name = "name")
public String getName() {
return name;
}
// getter and setter ...
}
@Entity
@DiscriminatorValue(value = "category1")
public class Category1 extends BaseCategorySingle {
private String value1;
@Column(name = "value1")
public String getValue1() {
return value1;
}
public void setValue1(String value) {
this.value1 = value;
}
}
@Entity
@DiscriminatorValue(value = "category2")
public class Category2 extends BaseCategorySingle {
private String value2;
@Column(name = "value2")
public String getValue2() {
return value2;
}
public void setValue2(String value) {
this.value2 = value;
}
}
SQL代码:
CREATE TABLE `category_single` (
)
2,基类一张表,每个子类一张表
java代码:
@Entity
@Table(name = "category_join")
@Inheritance(strategy = InheritanceType.JOINED)
public class BaseCategoryJoin {
private Integer id;
private String name;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
public Integer getId() {
return id;
}
@Column(name = "name")
public String getName() {
return name;
}
// getter and setter ...
}
@Entity
@PrimaryKeyJoinColumn(name = "c_id")
public class Category3 extends BaseCategoryJoin {
private String value3;
@Column(name = "value3")
public String getValue3() {
return value3;
}
public void setValue3(String value) {
this.value3 = value;
}
}
@Entity
@PrimaryKeyJoinColumn(name = "c_id")
public class Category4 extends BaseCategoryJoin {
private String value4;
@Column(name = "value4")
public String getValue4() {
return value4;
}
public void setValue4(String value) {
this.value4 = value;
}
}
SQL代码:
CREATE TABLE `category_join` (
)
CREATE TABLE `category3` (
)
CREATE TABLE `category4` (
)
3,基类无表,每个子类一张表
java代码:
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class BaseCategoryMany {
protected Integer id;
private String name;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId() {
return id;
}
@Column(name = "name")
public String getName() {
return name;
}
// setter and getter ...
}
@Entity
@Table(name = "category5")
public class Category5 extends BaseCategoryMany {
// 可以自己定义主键
private String value5;
@Column(name = "value5")
public String getValue5() {
return value5;
}
public void setValue5(String value) {
this.value5 = value;
}
}
@Entity
@Table(name = "category6")
public class Category6 extends BaseCategoryMany {
// 可以自己定义主键
private String value6;
@Column(name = "value6")
public String getValue6() {
return value6;
}
public void setValue6(String value) {
this.value6 = value;
}
}
SQL代码:
CREATE TABLE `category5` (
)
CREATE TABLE `category6` (
)
参考资料:http://blog.sina.com.cn/s/blog_ae50b9570101a3ky.html