Hibernate继承映射

Hibernate的继承映射:
1,一个继承结构一张表,通过鉴别器区分记录属于哪个子类
2,基类一张表,每个子类一张表,基类存放公共属性,子类存放扩展属性
3,基类无表,每个子类一张表,存放所有属性

一,XML配置
参考:http://www.blogjava.net/Tower/archive/2005/03/02/1617.html
假设我们有四个类Animal,Dog,Cat,其代码如下:
文件名:Animal.java
class Animal {
    private String identifier;
    private String name;
    private String category;
    // setter and getter
}

文件名:Dog.java
class Dog extends Animal {
    private String 
    // setter and getter
}

文件名:Cat.java
class Cat extends Animal {
    private String 
    // setter and getter
}

1,一个继承结构一张表:限制就时子类不能有NOT NULL属性
      
2,基类一张表,每个子类一张表:可以使用一个映射文件实现,也可以分成多个映射文件来实现
      
       文件名:Dog.hbm.xml
      
      
       文件名:Cat.hbm.xml
        
3,基类无表,每个子类一张表:每一个子类的映射文件将要包含所有父类中的属性
     
       文件名:Cat.hbm.xml
      
二,注解配置
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` (
  `dtype` varchar(31) NOT NULL,
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  `value2` varchar(255) default NULL,
  `value1` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
)


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` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
)
CREATE TABLE `category3` (
  `value3` varchar(255) default NULL,
  `c_id` int(11) NOT NULL,
  PRIMARY KEY  (`c_id`),
  KEY `FKD4C702D5E92DD3B3` (`c_id`),
  CONSTRAINT `FKD4C702D5E92DD3B3` FOREIGN KEY (`c_id`) REFERENCES `category_join` (`id`)
)
CREATE TABLE `category4` (
  `value4` varchar(255) default NULL,
  `c_id` int(11) NOT NULL,
  PRIMARY KEY  (`c_id`),
  KEY `FKD4C702D6E92DD3B3` (`c_id`),
  CONSTRAINT `FKD4C702D6E92DD3B3` FOREIGN KEY (`c_id`) REFERENCES `category_join` (`id`)


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` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  `value5` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
CREATE TABLE `category6` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  `value6` varchar(255) default NULL,
  PRIMARY KEY  (`id`)


参考资料:http://blog.sina.com.cn/s/blog_ae50b9570101a3ky.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值