JPA循环参考."对象引用未保存的瞬态实例"

fan*_*ncy 2 orm hibernate jpa many-to-one java-ee

我正在使用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;

    ...
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个新文件和一个新文件夹.我把文件放在文件夹中.现在文件位于文件夹"files"-collection中,文件夹在"rootFolder"文件中引用 - 变量.

如果我坚持这一点,我得到"对象引用未保存的瞬态实例"或"在刷新之前保存瞬态实例:entities.file.rootFolder - > entities.Category"(取决于首先保留的内容).

有一种方法可以诠释这个,所以无论我先保存什么都行不通!我可以以某种方式以编程方式解决它插入第一个实体而不引用另一个,然后插入另一个然后放入引用,但我不认为这应该是必要的.

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

我很感激任何想法或指导教程.

Rya*_*art 5

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

我已根据您的代码在Github上创建了一个工作示例.您可以浏览代码和/或克隆项目并使用以下命令运行它:

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
Run Code Online (Sandbox Code Playgroud)