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