继承继承对ManyToMany的外键冲突

问题描述

我目前正在构建以下场景: 我有一个操作,其中包含一个参数列表。这些也可以处于其他动作中,所以我有一个ManyToMany关系。 Parameter是一个抽象类,一个实现是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;

  ...
}

和TextParameter:

@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> {
}

所以现在,当我现在创建一个包含参数对象的Action-Object并使用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方法试图删除违反约束条件的参数...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...