【问题标题】:Cascade within @EmbeddedId in hibernate休眠中@EmbeddedId 内的级联
【发布时间】:2017-10-23 12:59:59
【问题描述】:

我正在添加一个包含附加数据的交集表,并且我使用 @EmbeddedId 为受此表中的记录绑定的实体(entity1entity2)。

我想在保存实体 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;
    //...
}

【问题讨论】:

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


    【解决方案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。

    【讨论】:

    • 您的第二个解决方案对我有用。我添加了自动生成的 ID 并将我的旧 ID 设置为 @Embedded 对象。但是,为什么一开始就出现@EmbeddedId 里面不支持级联保存呢?有记录吗?
    猜你喜欢
    • 2015-06-28
    • 2013-05-22
    • 2010-12-31
    • 2020-01-05
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多