Hibernate无法使用级联全部

时间:2017-01-02 07:59:16

标签: java mysql hibernate

我有以下两个班级。类“类型”具有“内容”类的对象。 我想通过使用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个

2 个答案:

答案 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);