[英]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.