簡體   English   中英

TransientObjectException:object引用未保存的瞬態實例 - 在刷新之前保存瞬態實例

[英]TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

我知道這個問題已被多次詢問,但我找不到合適的答案。

我在Spring Roo應用程序中有兩個實體,它們處於多對多關系,發布和組件中。

首先,我通過獲取現有版本的實例

selectedRelease = Release.findReleasesByReleaseNumberEquals(version).getSingleResult();

上面的方法是一個Roo生成的查找程序,如下所示:

public static TypedQuery<Release> Release.findReleasesByReleaseNummerEquals(String releaseNumber) {
    EntityManager em = Release.entityManager();
    TypedQuery<Release> q = em.createQuery("SELECT o FROM Release AS o WHERE LOWER(o.releaseNumber) LIKE LOWER(:releaseNummer)", Release.class);
    q.setParameter("releaseNumber", releaseNumber);
    return q;
}

然后我創建一個新的Component實例,並嘗試將其分配給選定的Release

Component component = new Component();

Set<Release> releases = new HashSet<Release>();
releases.add(selectedRelease);

component.setReleases(releases);
component.persist();

在嘗試執行persist()時,我得到了異常:

TransientObjectException:對象引用未保存的瞬態實例 - 在刷新之前保存瞬態實例:com.Release;

有沒有人有關於這個問題的建議?

映射看起來像這樣:

Release.java:

@ManyToMany(cascade = CascadeType.PERSIST, mappedBy = "releases")
private Set<Component> components = new HashSet<Component>();

Component.java

@ManyToMany(cascade=CascadeType.PERSIST)
private Set<Release> releases = new HashSet<Release>();

消息很明確:您正在嘗試保存引用另一個尚未保存的對象的對象組件,selectedRelease。

解決方案似乎很簡單:只需在保存組件之前保存(並在需要將更改通過數據庫傳遞時刷新)Release對象。

但是,JPA允許您使用TRANSITIVE PERSISTENCE避免所有這些句子,即@ ToMany注釋中的級聯選項。

如果您有一個雙向關系,只需要一個警告,當您在其中一個@ ... ToMany關聯中有一個mappedBy屬性時。 在這種情況下,您需要一種方便的方法來管理關聯,即設置關聯的兩側。

例如,Component中的addRelease(Release r)都將發布添加到組件的集合中,並將組件(實際上, 實例)設置為作為參數傳遞的發布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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