gpt4 book ai didi

spring - transient 对象异常 : object references an unsaved transient instance - save the transient instance before flushing

转载 作者:行者123 更新时间:2023-12-01 11:02:23 32 4
gpt4 key购买 nike

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

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



有没有人有关于这个问题的建议?

映射如下所示:

发布.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>();

最佳答案

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

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

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

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

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

关于spring - transient 对象异常 : object references an unsaved transient instance - save the transient instance before flushing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9549098/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com