簡體   English   中英

Hibernate無法使用層疊全部保存子對象

[英]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也應保存到數據庫中。 但是在實體TypeOneToOne注釋不包含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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM