当前位置: 首页 > 知识库问答 >
问题:

JPA循环引用。“对象引用了未保存的瞬态实例”

苏俊友
2023-03-14

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

    ...
}

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

我必须有一种方法来注释这一点,这样它就会起作用,不管我先保存什么!?我可以通过编程的方式来解决这个问题,首先插入一个实体,而不引用另一个实体,然后插入另一个实体,然后放入引用,但我不认为这是必需的。

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

我将非常感谢任何关于教程的想法或指导。

共有1个答案

伍捷
2023-03-14

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

我根据您的代码在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
 类似资料: