gpt4 book ai didi

hibernate - JPA 循环引用。 "object references an unsaved transient instance"

转载 作者:行者123 更新时间:2023-12-02 05:14:11 28 4
gpt4 key购买 nike

我正在使用 JPA/Hibernate。

假设我有文件夹和文件。每个文件夹可以包含更多文件夹和文件。每个文件都知道它的根文件夹是什么(不是父文件夹)。

@Entity
public class Folder{
...

@OneToMany
@JoinColumn("folder_id")
private List<Folder> folders;

@OneToMany
@JoinColumn("file_id")
private List<File> files;

...
}

@Entity
public class File {
...

@ManyToOne
private Folder rootFolder;

...
}

我创建了一个新文件和一个新文件夹。我把文件放在文件夹里。现在文件位于文件夹“files”-collection 中,文件夹在文件“rootFolder”-variable 中被引用。

如果我坚持这个,我会得到“对象引用一个未保存的 transient 实例”或“在刷新之前保存 transient 实例:entities.file.rootFolder -> entities.Category”(取决于首先持久化的内容)。

必须有一种方法可以对此进行注释,所以无论我先保存什么它都会起作用!?我可以通过编程方式以某种方式解决这个问题,先插入一个实体而不引用另一个实体,然后插入另一个实体,然后放入引用,但我认为这里不需要这样做。

我搜索了这个,但我能找到的只是@OneToMany 与@ManyToOne 的组合,但在我的情况下我不能使用它。文件夹不应该知道它是否是根文件夹。

对于教程的任何想法或指导,我将不胜感激。

最佳答案

这些映射或您描述的场景没有问题,假设它们都发生在一个事务中,或者更准确地说,它们之间没有刷新。您描述的错误发生在刷新时,这通常发生在事务提交时。它甚至在错误中告诉您,“在刷新之前保存 transient 实例”。不允许刷新部分保存的对象图。只要在刷新发生之前保存图形中的所有对象,就可以了。

我已经根据您的代码在 Github 上创建了一个工作示例。你可以browse the code和/或克隆项目并运行它:

git clone git://github.com/zzantozz/testbed.git tmp
cd tmp/stackoverflow/14921963-hibernate-circular-reference
mvn -q compile exec:java -D exec.mainClass=com.foo.Main

关于hibernate - JPA 循环引用。 "object references an unsaved transient instance",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14921963/

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