Java Hibernate无法使用“全部级联”保存子对象

Java Hibernate无法使用“全部级联”保存子对象,java,mysql,hibernate,Java,Mysql,Hibernate,我有以下两门课。类“Type”具有类“Content”的对象。 我想使用hibernate.save()方法保存类“Type”的所有引用对象。我已将级联类型指定为类中的所有“内容” 以下是我面临的错误: 对象引用未保存的临时实例-在刷新之前保存临时实例 有人能帮我找出问题所在吗 public class Type { @OneToOne @JoinColumn(name = "content_id") private Content content; }

我有以下两门课。类“Type”具有类“Content”的对象。 我想使用hibernate.save()方法保存类“Type”的所有引用对象。我已将级联类型指定为类中的所有“内容”

以下是我面临的错误: 对象引用未保存的临时实例-在刷新之前保存临时实例

有人能帮我找出问题所在吗

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选项,应该可以实现这一点。是