簡體   English   中英

休眠:將現有實體與新的“雙親”孩子合並

[英]Hibernate: Merging existing Entities with new “Double Parented” Children

我在將特定方案與Hibernate配合使用時遇到了一些困難...

考慮到上面的代碼段(簡化模型),實體A和D已經存在。 他們將收到新的兒童B和E,E也將有新的C兒童。 然后,我在實體管理器中調用“合並”方法。

@Entity
public class A {

    @OneToMany(mappedBy = "a", fetch = FetchType.Lazy, cascade = CascadeType.All)
    private List<B> bList;

}

@Entity
public class B {

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinCollumn(name="ID_A")
    private A a;

    @OneToMany(mappedBy = "b", fetch = FetchType.Lazy, cascade = CascadeType.All)
    private List<E> eList;

}

@Entity
public class C {

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinCollumn(name="ID_E")
    private E e;

}

@Entity
public class D {

    @OneToMany(mappedBy = "d", fetch = FetchType.Lazy, cascade = CascadeType.All)
    private List<E> bList;

}

// The "Double Parented" Children
@Entity
public class E {

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinCollumn(name="ID_B")
    private B b;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinCollumn(name="ID_D")
    private D d;

    @OneToMany(mappedBy = "e", fetch = FetchType.Lazy, cascade = CascadeType.All)
    private List<C> cList;

}

public class Example {
    public void newChildren() {
        A a = getExistingAfromDatabase(); // defined elsewhere
        E e = new E(); // then fills some attributes...
        B b = new B(); // then fills some attributes...

        b.getEs().add(e);
        e.setB(b);

        a.getBs().add(b);
        b.setA(a);

        edit(a);           
    }

    public void edit(A myEntity) {
        EntityTransaction trans = null;
        EntityManager eMngr = getEntityManager(); // this is defined in another place

        try {
            trans = eMngr.getTransaction();
            trans.begin();

            eMngr.merge(myEntity);
            trans.commit();
        } catch (Exception e) {
            if (trans != null && trans.isActive())
                trans.rollback();

            throw new DAOException("Error! " + e.getMessage(), e);
        }       
    }
}

無論我選擇首先合並的哪個實體(A或D),我都會遇到相同的異常:org.hibernate.TransientObjectException:對象引用了一個未保存的瞬態實例-在刷新之前保存該瞬態實例:Eb-> B

Hibernate能夠使用Cascade處理嗎? 如果是這樣,我做錯了什么?

非常感謝!

確保始終設置父級和子級,因此在使用A和B時,您應該在基類中使用這種實用程序方法(例如A):

public void addChild(B child) {
    child.setA(this);
    this.bList.add(child);
}

此實用程序應阻止您獲取此類異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM