【问题标题】:TransientObjectException: object references an unsaved transient instance - save the transient instance before flushingTransientObjectException:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例
【发布时间】:2012-03-21 21:20:08
【问题描述】:

我知道这个问题已经被问过很多次了,但我找不到适合我的答案。

我在 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>();

组件.java

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

【问题讨论】:

  • 你能发布你的ReleaseComponent的映射吗?
  • 我通过在 setReleases() 之前执行 persist() 解决了这个问题

标签: spring hibernate jpa spring-roo


【解决方案1】:

消息很明确:您正在尝试保存一个对象、组件,该对象引用了另一个尚未保存的对象 selectedRelease。

解决方案似乎很简单:只需在保存组件之前保存(并在您希望将更改传送到数据库时刷新)Release 对象。

但是,JPA 允许您使用 TRANSITIVE PERSISTENCE 避免所有这些句子,即 @...ToMany 注释中的 cascade 选项。

如果你有一个双向关系,当你在 @...ToMany 关联之一中有一个 mappedBy 属性时,只是一个警告。在这种情况下,您需要一种方便的方法来管理关联,即设置关联的双方。

例如,Component 中的 addRelease(Release r) 既将发布添加到组件的集合中,又将组件(实际上是 this 实例)设置为作为参数传递的发布。

【讨论】:

  • 感谢您的建议。我在映射的两边都添加了 cascade=CascadeType.PERSIST 但它仍然不起作用。这可能是因为我没有管理协会的方法吗?能举个例子吗?
猜你喜欢
  • 2012-11-08
  • 2012-02-27
  • 2019-01-14
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 2013-01-04
相关资源
最近更新 更多