1

我有这两个实体,称为所有者和文件夹。每个文件夹都属于一个所有者。在文件夹中,我们可以有子文件夹,等等。

所有者实体

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "FOLDER_ID", nullable = false)
private Set<Folder> folders = new HashSet<>();

@Column(nullable = false)
private String name;

// Getters and setters

文件夹实体

@ManyToOne
@JoinColumn(name = "PARENT_FOLDER_ID")
private Folder parent;

@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
private Set<Folder> children = new HashSet<>(); // recursive

@Column(nullable = false)
private String name;

// Getters and setter

名为 Steve 的所有者有一个名为 mainFolder 的文件夹,其中包含一个 subFolder。当试图坚持所有者时,我遇到了 backref 问题。我相信这是由于子文件夹不知道它的所有者是谁。问题是,由于 subFolder 在 mainFolder 内,而 mainFolder 属于 Steve,这使得 subFolder 也属于 Steve。我可以使用什么 JPA 关系来解决这个问题?

public static void main(String[] args) {

    Folder mainFolder = new Folder();
    Folder subFolder = new Folder();

    mainFolder.setName("Main Folder");
    mainFolder.getChildren().add(subFolder);
    subFolder.setName("SubFolder");
    subFolder.setParent(mainFolder);

    Owner owner = new Owner();
    owner.setName("Steve");
    owner.getFolders().add(mainFolder);

    em.getTransaction().begin();
    em.persist(owner); // backrefs error when trying to persist
    em.getTransaction().commit();
}

异常日志

Caused by: org.hibernate.PropertyValueException: not-null property references a null or   transient value: entity.Folder._foldersBackref
at org.hibernate.engine.Nullability.checkNullability(Nullability.java:72)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:290)

我正在使用 H2 休眠。

4

0 回答 0