JPA Hibernate 继承映射

 在面向对象的程序领域中,类与类之间是有继承关系的,例如Java世界中只需要extends关键字就可以确定这两个类的父子关系,但是在关系数据库中,有的知识关联关系。为了将继承映射到关系数据库中,Hibernate提供了3中方式

  •  整个的继承体系就用一张表(single_table)注解:@Inheritance(strategy =InheritanceType.SINGLE_TABLE)
  •  每个类一张表,子类存放所特有的属。性注解:@Inheritance(strategy= InheritanceType.JOINED)
  • 每个具体类一张表,子类所特有的属性。对应注解:注解为:@Inheritance(strategy =InheritanceType.TABLE_PER_CLASS)

 Annotation中使用的是@inheritance注解,并且要使用strategy策略指定方式

具体实例

现在假设有People、student、teacher三个类,

1·单表

该种方式SINGLE_TABLE是将父类和其所有的子类集合在一块,存在一张表中,并创建一个新的字段来判断对象的类型。

通过@Enitty引入实体

@Table(name="表名")

@colum列名称 

@Entity
@Table(name = "People")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "emp_type")
public class People  implements Serializable {

	private static final long serialVersionUID = -7674269980281525370L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	protected Integer Id;
	
	@Column
	protected String name;
	// getter/setter方法
	
}

学生实体

 

@Entity
@DiscriminatorValue("ES") //辨别字段
public class Student extends People  {

	private static final long serialVersionUID = 9115429216382631425L;

	@Column
	private int className;

	// getter/setter方法
	
}

教师实体

@Entity
@DiscriminatorValue("PT")
public class Teacher  extends People{

	private static final long serialVersionUID = -6122347374515830424L;

	@Column(name = "hourly_wage")
	private Double salary

	// getter/setter方法


}

上面的例子中,只会生成一个表,包含了字段emp_type、Id、name、salary、className。当保存student时,emp_type的值为“ST”,当保存Teacehere时,emp_type的值为"PT"。


2·每个子类一张表,存放自己特有特性。

这种策略超类会被映射成一个单独的表,每个子类也会映射成一个单独的表。子类对应的表中只包括自身属性对应的字段,默认情况下使用主键作为超类对应的表的外键(同时也值主键,称为唯一外键)。

会将超类也生成一张表,少了辨别字段。

基本的写法如下:

@Entity
@Table(name = "People")
@Inheritance(strategy = InheritanceType.JOINED)//重点策略的不同
public class People  implements Serializable {

	private static final long serialVersionUID = -7674269980281525370L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	protected Integer Id;
	
	@Column
	protected String name;

	// getter/setter方法
	
}

学生实体

@Entity
@Table(name = "Student")
public class Student extends People  {

	private static final long serialVersionUID = 9115429216382631425L;

	@Column
	private int className;

	// getter/setter方法
	
}

教师实体

@Entity
@Table(name = "Teacher")
public class Teacher  extends People{

	private static final long serialVersionUID = -6122347374515830424L;

	@Column(name = "hourly_wage")
	private Double salary

	// getter/setter方法


}

这种映生成第三章表,分别是PeopleStudentTeacher people 中为共有字段, stuentTeacher为给自特有字段,同时

People中的主键id作为StudentTeacher的外键,同时也是主键存在。 子类保存一条数据,会在people中插入一条记录,然后在子类表中再插入数据。


3·每个具体类一个表

这种映射策略每个具体类都会映射成一个单独的表,类的所有属性,包括继承的属性都会映射成表的列

具体实例我们看父类

@Entity
@Table(name = "People")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public  abstract class People implements Serializable {//抽象类

	private static final long serialVersionUID = -7674269980281525370L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	protected Integer Id;
	
	@Column
	protected String name;

	// getter/setter方法
	
}

父类的abstract特性是不映射为具体的一个表的。

小结:

以上为JPAHibernate继承映射的实现。与Hibernater的配置相比简单的很多,但是灵活性却少了很多,同时该配置的通用性却大大提高了。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。