问题描述
我目前正在构建以下场景: 我有一个操作,其中包含一个参数列表。这些也可以处于其他动作中,所以我有一个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
方法试图删除违反约束条件的参数...