Hibernate中有哪些继承映射策略?
在Hibernate中,当实体对象之间存在继承关系时,需要选择一种合适的继承映射策略来正确地实现关系的映射。Hibernate提供了三种继承映射策略,分别是单表继承映射策略、类层次继承映射策略和子表继承映射策略。
阅读更多:MySQL 教程
单表继承映射策略
单表继承映射策略是指将所有继承树中的实体都映射到同一个数据库表中,通过一个类型字段将各个实体类型区分开来。对应的实体类需要使用@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
进行注解,并指定类型字段。例如:
@Entity
@Table(name = "employee")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "employee_type")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "emp_id")
private Long empId;
@Column(name = "emp_name")
private String empName;
}
@Entity
@DiscriminatorValue("manager")
public class Manager extends Employee {
// Manager特有的属性和方法
}
@Entity
@DiscriminatorValue("engineer")
public class Engineer extends Employee {
// Engineer特有的属性和方法
}
在上述代码中,Employee
是基类,Manager
和Engineer
是Employee
的子类。@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
注解表示采用单表继承映射策略,在Employee
实体类中通过@DiscriminatorColumn(name = "employee_type")
注解来指定区分实体类型的字段名为employee_type
。
类层次继承映射策略
类层次继承映射策略是指将继承树中的每个实体都映射为一张独立的数据库表,在数据库中每个表都有一个对应的主键。对应的实体类需要使用@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
进行注解。例如:
@Entity
@Table(name="employee")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="emp_id")
private Long empId;
@Column(name="emp_name")
private String empName;
//基类定义的属性和方法
}
@Entity
@Table(name="manager")
public class Manager extends Employee {
//Manager特有的属性和方法
}
@Entity
@Table(name="engineer")
public class Engineer extends Employee {
//Engineer特有的属性和方法
}
在上述代码中,Employee
是基类,Manager
和Engineer
是Employee
的子类。@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
注解表示采用类层次继承映射策略。
子表继承映射策略
子表继承映射策略是指将每个实体映射为一个独立的数据库表,在每个实体对应的表中除了主键外还需要包含从父类继承而来的所有属性。对应的实体类需要使用@Inheritance(strategy = InheritanceType.JOINED)
进行注解,并使用@PrimaryKeyJoinColumn
注解来设置子表的外键关联到父表主键。例如:
@Entity
@Table(name = "employee")
@Inheritance(strategy = InheritanceType.JOINED)
public class Employee {
@Id
@GeneratedValue
@Column(name = "emp_id")
private Long empId;
@Column(name = "emp_name")
private String empName;
}
@Entity
@Table(name = "manager")
@PrimaryKeyJoinColumn(name = "emp_id")
public class Manager extends Employee {
//Manager特有的属性和方法
}
@Entity
@Table(name = "engineer")
@PrimaryKeyJoinColumn(name = "emp_id")
public class Engineer extends Employee {
//Engineer特有的属性和方法
}
在上述代码中,Employee
是基类,Manager
和Engineer
是Employee
的子类。@Inheritance(strategy = InheritanceType.JOINED)
注解表示采用子表继承映射策略,在Manager
和Engineer
实体类中通过@PrimaryKeyJoinColumn(name = "emp_id")
注解来设置与父表的外键关联。
结论
以上是Hibernate中实现继承映射的三种策略,具体应该选择哪种策略需要根据具体业务情况进行考虑。在选择的时候需要考虑到查询和维护的效率、数据的一致性等因素。希望这篇文章能对大家在Hibernate开发中的继承映射有所帮助。