代码之家  ›  专栏  ›  技术社区  ›  dvelopp

hibernate中@EmbeddedId内级联

  •  1
  • dvelopp  · 技术社区  · 7 年前

    @嵌入ID 为被此表中的记录绑定的实体创建复杂ID( 实体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中的级联似乎被忽略了。我可以看到insert的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 回复  |  直到 7 年前
        1
  •  1
  •   Tom    7 年前

    不要使用Entity1ToEntity2Link,而是尝试直接的多对多关系。

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

    有两种方法可以通过使用Entity1ToEntity2Link来保存它。

    第一:不要将级联添加到Entity1ToEntity2Link,保存Entity1后保存链接。

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

    推荐文章