[英]Hibernate unable to save child objects using cascade all
我有以下兩節課。 “類型”類具有一個“內容”類的對象。 我想使用hibernate.save()方法保存“類型”類的所有引用對象。 我在“內容”類中將級聯類型指定為ALL。
以下是我遇到的錯誤:對象引用了一個未保存的瞬態實例-在刷新之前保存該瞬態實例。
有人可以幫我找出問題所在嗎?
public class Type {
@OneToOne
@JoinColumn(name = "content_id")
private Content content;
}
public class Content {
@OneToOne(mappedBy = "content", cascade = CascadeType.ALL)
private Type type;
}
public class Test {
public void createType() {
Type type = new Type();
Content content = someMethodToGetContent();
type.setContent(content);
save(type);
}
public void save(Object domainObj) {
getEntityManager().persist(domainObj);
getEntityManager().flush();
}
}
堆棧跟蹤:
由以下原因導致:org.hibernate.TransientObjectException:對象引用了一個未保存的瞬態實例-在刷新之前保存該瞬態實例:.content-> .Content在org.hibernate.engine.CascadingAction $ 9.noCascade(CascadingAction.java:387)處。 org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)處的hibernate.engine.Cascade.cascade(Cascade.java:172)org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java: 145)在org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)在org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)在org.hibernate.impl.SessionImpl.flush (SessionImpl.java:1216)at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:795)...還有27個org.springframework.transaction.TransactionSystemException:無法提交JPA tr 無動於衷 嵌套的異常是javax.persistence.RollbackException:僅在org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:526)上標記為rollback的事務761)在org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)在org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:504)在org.springframework.transaction.interceptor.Transaction org.org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)上的org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)上的.invokeWithinTransaction(TransactionAspectSupport.java:292)。 springframework.aop.framework.JdkDynamicAopProxy.in com.sun.proxy。$ Proxy29.persist上的voke(JdkDynamicAopProxy.java:213)(未知源)原因:javax.persistence.RollbackException:事務標記為rollbackOnly在org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java :73)at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)...還有12個
請如下更改您的createType()。
public void createType() {
Type type = new Type();
Content content = someMethodToGetContent();
content.setType();
type.setContent(content);
save(type);
}
Hibernate無法使用層疊全部保存子對象
之所以不起作用,與您嘗試使用實體的方式有關。
讓我們看看下面的代碼在做什么:
Type type = new Type(); Content content = someMethodToGetContent(); type.setContent(content); save(type);
您通過調用save(type)
告訴持久性提供程序要保存type
,並且期望content
也應保存到數據庫中。 但是在實體Type
, OneToOne
注釋不包含PERSIST
級聯選項。 因此,當Type
的實例被持久化時,您必須告訴持久化提供者持久化Content
的實例,方法是更改OneToOne
批注,如下所示:
@OneToOne(cascade=CascadeType.PERSIST) // modified
@JoinColumn(name = "content_id")
private Content content;
並且由於您已將實體定義為具有雙向關系,因此您應按如下所示正確連接它們:
Type type = new Type();
Content content = someMethodToGetContent();
content.setType(type); // modified
type.setContent(content);
save(type);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.