📜  Hibernate – 使用注解的每个子类的表(1)

📅  最后修改于: 2023-12-03 15:01:08.223000             🧑  作者: Mango

Hibernate – 使用注解的每个子类的表

在Hibernate中,我们可以使用注解来定义实体类和其属性,同时还可以使用单一表(Single Table)继承策略来处理实体类的继承关系,其中每个子类都将映射到同一个数据库表中。但是,有时候我们会想要每个子类映射到一个不同的表中。本文将介绍如何使用注解来实现这一需求。

步骤
  1. 在基类上使用@Inheritance注解,并将strategy属性设置为InheritanceType.JOINED。这表明我们将使用Joined Table继承策略来处理实体类的继承关系。

    @Entity
    @Table(name = "vehicles")
    @Inheritance(strategy = InheritanceType.JOINED)
    public abstract class Vehicle {
        ...
    }
    
  2. 在每个子类上使用@Entity注解,并将其映射到一个不同的数据库表中。我们可以使用@Table注解来指定表名。

    @Entity
    @Table(name = "cars")
    public class Car extends Vehicle {
        ...
    }
    
    @Entity
    @Table(name = "bikes")
    public class Bike extends Vehicle {
        ...
    }
    
  3. 在每个子类的@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;
        ...
    }
    
  4. 对于每个子类,我们需要使用@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注解指定在外键上使用哪个列。