基础实体和其他实体之间的连接继承和不同的关系类型

时间:2020-05-16 12:19:53

标签: spring hibernate foreign-keys relationship hibernate-mapping

问题描述:

我有以下情况(为了使问题更清楚:其他字段/获取者/设置者被省略):

@Entity
@Table(name = "car")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Car {
}

@Entity
public class PassengerCar extends Car {

    @OneToOne(mappedBy = "car", cascade = CascadeType.ALL, orphanRemoval = true)
    private SpireTire spareTire;
}

@Entity
public class Truck extends Car {

    @OneToMany(mappedBy = "car", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<SpireTire> spareTires = new LinkedList<>();
}

@Entity
public class SpireTire {

    @ManyToOne
    @JoinColumn(name = "id_car")
    private Car car;
}

以下假设:

  • 所有乘用车只能有1备用轮胎
  • 所有卡车都可以有多个备用轮胎
  • 可能还有其他与OneToOneOneToManySpireTire关系的汽车实现方式

目标是根据上述假设在“汽车”和“ SpireTire”之间建立正确的关系

我解决问题的方法:

我看到两种实现方式:

  1. 就像上面一样。 SpireTire实体对基本实体/表foreign key具有Car,并且每个汽车实现定义自己的关系。我对此有何看法:
    • 我不喜欢:插入新的SpireTire行以控制每个汽车实施的条目数时,需要进行验证。所以为汽车SpireTire添加新的PassengerCar要求在每次插入之前进行检查,并在数据库中查找给定汽车的行是否已存在,如我们声明的{{1 }},但处于SpireTire-ManyToOne关系。
    • 我喜欢:无论有多少种不同的汽车实现方式,都只需要PassengerCar中的一个OneToOne
  2. 每辆车foreign key分别有一个SpireTire。就像这样:

foreign key

以这种方式:

  • 我喜欢:它将每个汽车实现分开,因此每个人(包括休眠状态)都可以清楚地了解所涉及的关系类型和汽车实现。像第一种方法一样,在每次插入之前不需要严格的验证
  • 我不喜欢:与其他汽车实现方式一样,这需要我提供许多外键。因此,如果我有implementation个汽车实现,其中@Entity @Table(name = "car") @Inheritance(strategy = InheritanceType.JOINED) public abstract class Car { } @Entity public class PassengerCar extends Car { @OneToOne(mappedBy = "passengerCar", cascade = CascadeType.ALL, orphanRemoval = true) private SpireTire spareTire; } @Entity public class Truck extends Car { @OneToMany(mappedBy = "truck", cascade = CascadeType.ALL, orphanRemoval = true) private List<SpireTire> spareTires = new LinkedList<>(); } @Entity public class SpireTire { @OneToOne @JoinColumn(name = "id_passenger_car") private PassengerCar passengerCar; @ManyToOne @JoinColumn(name = "id_truck") private Truck truck; } 个是10,而只是9@OneToMany,则我必须定义1个不同的{ {1}}个。

问题:

我应该像在@OneToOne点那样,在10点那样实现还是完全不同?

0 个答案:

没有答案