其他分享
首页 > 其他分享> > spring – TransientObjectException:object引用未保存的瞬态实例 – 在刷新之前保存瞬态实例

spring – TransientObjectException:object引用未保存的瞬态实例 – 在刷新之前保存瞬态实例

作者:互联网

我知道这个问题已被多次询问,但我找不到合适的答案.

我在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: object references an unsaved transient instance – save the transient instance before flushing: 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)都将发布添加到组件的集合中,并将组件(实际上,此实例)设置为作为参数传递的发布.

标签:spring-roo,spring,jpa,hibernate
来源: https://codeday.me/bug/20190826/1730518.html