gpt4 book ai didi

java - hibernate 中 @EmbeddedId 内的级联

转载 作者:行者123 更新时间:2023-11-30 06:27:25 24 4
gpt4 key购买 nike

我正在添加一个包含附加数据的交集表,并使用 @EmbeddedId 为该表中的记录绑定(bind)的实体创建一个复杂的 ID(entity1实体2)。

我想在保存实体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 时出现错误:

violated - parent key not found

我怀疑@EmbeddedId不支持级联。但是,我不确定。您知道如何在保存 Entity1ToEntity2Link 之前保存实体2吗?

<小时/>

ID 对象:

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

您的方法存在以下问题。您尝试在 Entity1 上调用 save,将其级联到 Entity1ToEntity2Link。现在 Entity1ToEntity2Link 需要 Entity1 作为主键,但 Entity1 尚不存在。

有两种使用 Entity1ToEntity2Link 保存它的方法。

第一:不要向Entity1ToEntity2Link添加级联,并在保存Entity1后保存链接。

第二:将生成的 Id 添加到 Entity1ToEntity2Link。

关于java - hibernate 中 @EmbeddedId 内的级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46890001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com