具有继承的ManyToMany上的外键冲突



我目前正在构建以下场景:我有一个Action,里面有一个参数列表。这些也可能发生在其他行为中,所以我有一种多对多的关系。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;
...
}

和文本参数:

@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对象并使用actionRepository.persist(action)持久化它时,我会得到一个SQLServerExceptionThe INSERT statement conflicted with the FOREIGN KEY constraint "FK__Action2Pa__actio__4242D080,我不明白为什么。

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

在遇到这个问题超过3天后,我几乎在提出问题后就解决了。。。

问题出现在DB测试套件中。@AfterEach方法试图删除参数,这违反了Containt。。。

最新更新