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