在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class)、Joined策略(table per subclass)和Table_PER_Class策略。
来源:互联网 发布:淘宝卖家如何登录 编辑:程序博客网 时间:2024/05/16 23:48
http://zhuchengzzcc.iteye.com/blog/1679496
在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class)、Joined策略(table per subclass)和Table_PER_Class策略。
1.单表继承策略
单表继承策略,父类实体和子类实体共用一张数据库表,在表中通过一列辨别字段来区别不同类别的实体。具体做法如下:
a.在父类实体的@Entity注解下添加如下的注解:
@Inheritance(Strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name=”辨别字段列名”)
@DiscriminatorValue(父类实体辨别字段列值)
b.在子类实体的@Entity注解下添加如下的注解:
@DiscriminatorValue(子类实体辨别字段列值)
定义了一个父类
Java代码 收藏代码
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "WINDOW_FILE")
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING, length = 30)
@DiscriminatorValue("WindowFile")
public class WindowFile {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Basic
@Column(name = "NAME")
private String name;
@Basic
@Column(name = "TYPE")
private String type;
@Basic
@Column(name = "DATE")
private Date date;
//省略get set
}
后定义2个子类
Java代码 收藏代码
@Entity
@DiscriminatorValue("Folder")
public class Folder extends WindowFile {
@Basic
@Column(name = "FILE_COUNT")
private Integer fileCount;
//省略get set
}
Java代码 收藏代码
@Entity
@DiscriminatorValue("Document")
public class Document extends WindowFile {
@Basic
@Column(name = "SIZE")
private String size;
//省略get set
}
以上通过列DISCRIMINATOR的不同,区分具体父子实体。
实际表结构如下:
WINDOW_FILE DISCRIMINATOR,ID,NAME,DATE,TYPE,SIZE,FILE_COUNT
当你使用WindowFile实体时,实际表的字段为DISCRIMINATOR='WindowFile',SIZE与FILE_COUNT永远是空
当使用Folder实体时,DISCRIMINATOR='Folder',SIZE永远是空,FILE_COUNT为实际值。
Document同理,与Folder类似。
2.Joined策略
父类实体和子类实体分别对应数据库中不同的表,子类实体的表中只存在其扩展的特殊属性,父类的公共属性保存在父类实体映射表中。具体做法:
@Inheritance(Strategy=InheritanceType.JOINED)
子类实体不需要特殊说明。
Java代码 收藏代码
@Entity
@Table(name = "T_ANIMAL")
@Inheritance(strategy = InheritanceType.JOINED)
public class Animal {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "NAME")
private String name;
@Column(name = "COLOR")
private String color;
//省略get set
}
Java代码 收藏代码
@Entity
@Table(name = "T_BIRD")
@PrimaryKeyJoinColumn(name = "BIRD_ID")
public class Bird extends Animal {
@Column(name = "SPEED")
private String speed;
//省略get set
}
Java代码 收藏代码
@Entity
@Table(name = "T_DOG")
@PrimaryKeyJoinColumn(name = "DOG_ID")
public class Dog extends Animal {
@Column(name = "LEGS")
private Integer legs;
//省略get set
}
实际表结构如下:
T_ANIMAL ID,COLOR,NAME
T_BIRD SPEED,BIRD(既是外键,也是主键)
T_DOG LEGS,DOG_ID(既是外键,也是主键)
3.Table_PER_Class策略:
Table_PER_Class策略,父类实体和子类实体每个类分别对应一张数据库中的表,子类表中保存所有属性,包括从父类实体中继承的属性。具体做法:
只需在父类实体的@Entity注解下添加如下注解:
@Inheritance(Strategy=InheritanceType.TABLE_PER_CLASS)
Java代码 收藏代码
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "T_VEHICLE")
public class Vehicle { // 基类
@Id
// @GeneratedValue
@Column(name = "ID")
private Integer id;
@Column(name = "SPEED")
private Integer speed;// 速度
//省略get set
}
Java代码 收藏代码
@Entity
@Table(name = "T_CAR")
public class Car extends Vehicle {
@Column(name = "ENGINE")
private String engine;// 发动机
//省略get set
}
一旦使用这种策略就意味着你不能使用AUTO generator 和IDENTITY generator,即主键值不能采用数据库自动生成。
实际表结构如下:
T_VEHICLE ID,SPEED
T_CAR ID,SPEED,ENGINE
0 0
- 在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class)、Joined策略(table per subclass)和Table_PER_Class策略。
- (8) ebj学习: Jpa的SINGLE_TABLE,JOINED,TABLE_PER_CLASS三种继承策略
- JPA实体继承关系的映射策略
- JPA实体继承实体的映射策略
- JPA实体继承实体的映射策略
- JPA实体继承实体的映射策略
- JPA实体继承实体的映射策略
- 关于table per subclass继承映射的注意点
- Hibernate 之单表继承映射策略
- JPA对象关系模型之继承映射策略
- hibernate中继承映射的三种方式(SINGLE_TABLE,TABLE_PER_CLASS,JOINED)
- jpa 继承策略
- JPA继承策略
- JPA 对象继承策略
- Hibernate继承映射三种策略学习
- Hibernate 实体层设计--Table per subclass
- Hibernate 实体层设计--Table per subclass
- Hibernate继承映射策略
- Android LayoutInflate深度解析 给你带来全新的认识
- 正确插入目录并且自由更新
- Oracle/Mysql查询前N条数据的方法
- goim 安装
- eclipse中maven项目红叉解决方案
- 在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class)、Joined策略(table per subclass)和Table_PER_Class策略。
- 立体视觉系列1——相机标定原理
- LA 4850 Installations (排序+枚举)
- 第一个 django helloworld视图函数
- JQuery:事件冒泡和阻止默认行为
- MySQL数据加密与解密
- SpringMVC源码总结(八)类型转换PropertyEditor的背后
- java程序中前台后中文编码的问题
- linux 内核宏定义:#define typecheck(type,x)