我有这两个实体,称为所有者和文件夹。每个文件夹都属于一个所有者。在文件夹中,我们可以有子文件夹,等等。
所有者实体
@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 休眠。