Java Hibernate无法使用“全部级联”保存子对象
我有以下两门课。类“Type”具有类“Content”的对象。 我想使用hibernate.save()方法保存类“Type”的所有引用对象。我已将级联类型指定为类中的所有“内容” 以下是我面临的错误: 对象引用未保存的临时实例-在刷新之前保存临时实例 有人能帮我找出问题所在吗Java Hibernate无法使用“全部级联”保存子对象,java,mysql,hibernate,Java,Mysql,Hibernate,我有以下两门课。类“Type”具有类“Content”的对象。 我想使用hibernate.save()方法保存类“Type”的所有引用对象。我已将级联类型指定为类中的所有“内容” 以下是我面临的错误: 对象引用未保存的临时实例-在刷新之前保存临时实例 有人能帮我找出问题所在吗 public class Type { @OneToOne @JoinColumn(name = "content_id") private Content content; }
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();
}
}
Stacktrace:
原因:org.hibernate.transientObject异常:对象引用
未保存的临时实例-在之前保存临时实例
刷新:。内容->。内容位于
org.hibernate.engine.CascadingAction$9.noCascade(CascadingAction.java:387)
位于org.hibernate.engine.Cascade.Cascade(Cascade.java:172)
org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)
在
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)
org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:795)
... 还有27个
org.springframework.transaction.TransactionSystemException:无法
提交JPA事务;嵌套异常是
javax.persistence.RollbackException:标记为的Transaction
仅在
org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:526)
在
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
在
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
在
org.springframework.transaction.interceptor.TransactionSpectSupport.commitTransactionAfterReturning(TransactionSpectSupport.java:504)
在
org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:292)
在
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
在
org.springframework.aop.framework.ReflectiveMethodInvocation.procement(ReflectiveMethodInvocation.java:179)
在
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
在com.sun.proxy.$Proxy29.persist(未知源)上,由以下原因导致:
javax.persistence.RollbackException:标记为的事务
仅在
org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:73)位于
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);
}
请按如下所示更改您的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
,并且预期内容也应保存到数据库中。但是在实体Type
中,OneToOne
注释不包含PERSIST
cascade选项。因此,当通过更改OneToOne
注释来持久化Type
的实例时,您必须告诉持久化提供程序列出Content
的实例,如下所示:
@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);
Hibernate无法使用“全部级联”保存子对象
这不起作用的原因与您试图分散实体的方式有关
- 让我们看看下面的代码在做什么:
Type type = new Type();
Content content = someMethodToGetContent();
type.setContent(content);
save(type);
您通过调用save(type)
告诉持久性提供程序您要保存type
,并且预期内容也应保存到数据库中。但是在实体Type
中,OneToOne
注释不包含PERSIST
cascade选项。因此,当通过更改OneToOne
注释来持久化Type
的实例时,您必须告诉持久化提供程序列出Content
的实例,如下所示:
@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);
代码试图保存在哪里?它节省了什么?异常的完整堆栈跟踪是什么?类中是否有瞬态变量?@jbniset:Addedcode@LKTN字体没有t@minion您的保存不带任何参数,domainObj是什么?这就是你要传递的。代码试图保存在哪里?它节省了什么?异常的完整堆栈跟踪是什么?类中是否有瞬态变量?@jbniset:Addedcode@LKTN字体没有t@minion您的保存不带任何参数,domainObj是什么?这就是你要通过的。非常感谢你指出我错过了什么。我向“Type”类添加了cascade选项,对象被持久化。非常感谢!我还有一个问题。假设上面的对象“Type”与许多对象“A”、“B”、“C”有1-1关系。我想确保无论何时持久化'Type','A','B'和'C'都是。但并非相反,即当我坚持“A”时,我不希望“Type”被坚持。如果我只在类“Type”中添加CASCADE选项,而不是在类“A”、“B”、“C”中添加CASCADE选项,应该可以实现这一点。是