在hibernate中的@EmbeddedId中级联

时间:2017-10-23 12:59:59

标签: java hibernate jpa jpa-2.0 hibernate-cascade

我添加了一个包含其他数据的交集表,并使用 @EmbeddedId 为此表中的记录绑定的实体创建一个复杂的ID( entity1 < / em>和 entity2 )。

当我保存实体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不支持级联。但是,我不确定。在保存Entity1ToEntity2Link之前,您有什么想法可以保存entity2吗?

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;
    //...
}

1 个答案:

答案 0 :(得分:1)

不要使用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。