具有继承的 ManyToMany 上的外键违规

Foreign Key violation on ManyToMany with inheritance

我目前正在构建以下场景: 我有一个包含参数列表的操作。这些也可以在其他操作中,所以我有一个 ManyToMany 关系。 Parameter 是一个抽象 class,一种实现是 TextParameter。 所以现在我有以下代码:

@Data
@Entity
public class Action {
  
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  @JoinTable(
     name = "Action2ParameterMapping",
     joinColumns = @JoinColumn(name = "actionId"),
     inverseJoinColumns = @JoinColumn(name = "parameterId"))
  private List<Parameter> parameters;
}

参数为

@Data
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class ProductSample {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  ...
}

和文本参数:

@Data
@Entity
@PrimaryKeyJoinColumn(name = "parameterId")
public class TextParameter extends Parameter {
  ...
}
 

我现在创建了如下表(我不想生成,因为我们使用了 Flyway 迁移):

CREATE TABLE Action
(
  id    BIGINT NOT NULL PRIMARY KEY IDENTITY
)

CREATE TABLE Parameter
(
  id    BIGINT       NOT NULL PRIMARY KEY IDENTITY
)

CREATE TABLE TextParameter
(
  parameterId BIGINT NOT NULL FOREIGN KEY REFERENCES Parameter (id)
)

-- Many-To-Many MappingTable
CREATE TABLE Action2ParameterMapping
(
  actionId    BIGINT NOT NULL FOREIGN KEY REFERENCES Action (id),
  parameterId BIGINT NOT NULL FOREIGN KEY REFERENCES Parameter (id),
  PRIMARY KEY (actionId, parameterId)
)

我使用 Quarkus 并拥有简单的 PanacheRepository

@ApplicationScoped
public class ActionRepository implements PanacheRepository<Action> {
}

现在,当我创建一个包含参数对象的操作对象并使用 actionRepository.persist(action) 持久化它时,我得到一个 SQLServerException The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Action2Pa__actio__4242D080,我不明白为什么。

我知道它试图告诉我,它想在 MappingTable 中保留一个条目,但 actionId 不属于任何 Action,但这怎么可能呢? 我不明白,为什么这行不通。

纠结了3天多,问完问题就解决了...

问题出在 DB-Test-Suite 内。 @AfterEach方法试图删除参数,这违反了约束...