我正在添加一个包含其他数据的交集表,我使用 @EmbeddedId 为受此表中记录绑定的实体(实体 1 和实体 2)制作一个复杂的 ID。
我想在保存实体 1 时通过级联保存所有数据。所以,这就是为什么在实体 1 中我有:
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH},
fetch = FetchType.LAZY, mappedBy = "id.entity1")
private List<Entity1ToEntity2Link> links = new ArrayList<>();
在Entity1ToEntity2Link中,我有@EmbeddedId,在其中我有指向两个实体的链接。但是,我希望在保存实体 1 时保存第二个。所以,我把它做成这样:
@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
private Entity2 entity2;
但是,不幸的是,我@EmbeddedId内部的级联似乎被忽略了。我可以看到没有生成用于插入的sql,并且当保存Entity1ToEntity2Link时,我收到一个错误:
违反 - 找不到父密钥
我怀疑@EmbeddedId不支持级联。但是,我不确定。您有什么想法如何在保存实体 1 到实体 2Link 之前保存实体 2 吗?
标识对象:
@Embeddable
public class LinkId extends AbstractLinkId {
//...
@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
private Entity2 entity2;
//...
}
@MappedSuperclass
public class AbstractLinkId {
//...
@ManyToOne
private Entity1 entity1;
//...
}
不要使用 Entity1ToEntity2Link 尝试直接的 ManyToMany 关系。
public class Entity1 {
@ManyToMany
@JoinTable(
name="LINK_TABLE_NAME",
joinColumns=@JoinColumn(name="ENTITY1_ID", referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name="ENTITY2_ID", referencedColumnName="ID"))
private List<Entity2> entities2;
}
public class Entity2 {
@ManyToMany(mappedBy="entities2")
private List<Entity1> entities1;
}
你的方法的问题如下。您尝试在实体 1 上调用 save,这会将其级联到 Entity1ToEntity2Link。现在,Entity1ToEntity2Link 需要 Entity1 作为主键,但 Entity1 尚不存在。
它们是使用Entity1ToEntity2Link保存它的两种方法。
第一:不要将级联添加到实体 1到实体 2链接,并在保存实体 1 后保存链接。
第二:将生成的 ID 添加到 Entity1ToEntity2Link。