我有以下两个班级。类“类型”具有“内容”类的对象。 我想通过使用hibernate.save()方法保存类'Type'的所有引用对象。我已在“内容”类中将级联类型指定为ALL。
以下是我面临的错误: object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。
有人可以帮我确定问题所在吗?
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 at org.hibernate.engine.CascadingAction $ 9.noCascade(CascadingAction.java:387) 在org.hibernate.engine.Cascade.cascade(Cascade.java:172)at 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)at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:795) ......还有27个 org.springframework.transaction.TransactionSystemException:无法 提交JPA事务;嵌套异常是 javax.persistence.RollbackException:Transacti on标记为 rollbackOnly at 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.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:504) 在 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) at com.sun.proxy。$ Proxy29.persist(Unknown Source)引起: javax.persistence.RollbackException:标记为的事务 rollbackOnly at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:73)at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) ......还有12个
答案 0 :(得分:1)
请更改您的createType(),如下所示。
public void createType() {
Type type = new Type();
Content content = someMethodToGetContent();
content.setType();
type.setContent(content);
save(type);
}
答案 1 :(得分:1)
Hibernate无法使用cascade all
保存子对象
这不起作用的原因与您尝试持久化实体的方式有关。
让我们看看以下代码正在做什么:
Type type = new Type();
Content content = someMethodToGetContent();
type.setContent(content);
save(type);
您通过调用type
告诉要保存save(type)
的持久性提供程序,并期望content
也应该保存到数据库中。但是在实体Type
中,OneToOne
注释不包含PERSIST
级联选项。因此,您必须通过更改Content
注释来告知持久性提供程序在Type
的实例持久存在时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);