📅  最后修改于: 2023-12-03 15:01:08.223000             🧑  作者: Mango
在Hibernate中,我们可以使用注解来定义实体类和其属性,同时还可以使用单一表(Single Table)继承策略来处理实体类的继承关系,其中每个子类都将映射到同一个数据库表中。但是,有时候我们会想要每个子类映射到一个不同的表中。本文将介绍如何使用注解来实现这一需求。
在基类上使用@Inheritance注解,并将strategy属性设置为InheritanceType.JOINED。这表明我们将使用Joined Table继承策略来处理实体类的继承关系。
@Entity
@Table(name = "vehicles")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Vehicle {
...
}
在每个子类上使用@Entity注解,并将其映射到一个不同的数据库表中。我们可以使用@Table注解来指定表名。
@Entity
@Table(name = "cars")
public class Car extends Vehicle {
...
}
@Entity
@Table(name = "bikes")
public class Bike extends Vehicle {
...
}
在每个子类的@Id属性上使用@GeneratedValue注解来生成唯一的ID。
@Entity
@Table(name = "cars")
public class Car extends Vehicle {
@Id
@GeneratedValue
@Column(name = "car_id")
private Long id;
...
}
@Entity
@Table(name = "bikes")
public class Bike extends Vehicle {
@Id
@GeneratedValue
@Column(name = "bike_id")
private Long id;
...
}
对于每个子类,我们需要使用@JoinTable来指定它应该加入哪个数据库表中。我们还需要使用@PrimaryKeyJoinColumn注解来指定在外键上使用哪个列。
@Entity
@Table(name = "cars")
@PrimaryKeyJoinColumn(name = "car_id")
@JoinTable(name = "car_details",
joinColumns = @JoinColumn(name="car_id"),
inverseJoinColumns = @JoinColumn(name="car_details_id"))
public class Car extends Vehicle {
...
}
@Entity
@Table(name = "bikes")
@PrimaryKeyJoinColumn(name = "bike_id")
@JoinTable(name = "bike_details",
joinColumns = @JoinColumn(name="bike_id"),
inverseJoinColumns = @JoinColumn(name="bike_details_id"))
public class Bike extends Vehicle {
...
}
在Hibernate中使用注解来实现每个子类映射到不同的数据库表中,需要对基类和每个子类分别使用@Entity和@Table注解,并在每个子类的@Id属性上使用@GeneratedValue注解来生成唯一的ID。此外,我们还需要使用@JoinTable来指定每个子类应该加入哪个数据库表中,并使用@PrimaryKeyJoinColumn注解指定在外键上使用哪个列。