gpt4 book ai didi

java - Hibernate:持久化树状结构

转载 作者:行者123 更新时间:2023-12-05 00:56:19 24 4
gpt4 key购买 nike

我在 Collection 中有一个树状结构.我已经确保集合中的所有节点都不会进行无关的引用,并进行拓扑排序,使得集合头部的根节点和所有叶子都靠近它的末尾。

我的主要抽象节点类是这样的:

@Entity
public abstract class Node {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long ID;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "parent_id", insertable = false, updatable = false)
Node parent;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "root_id", insertable = false, updatable = false)
Node root;
}

我不维护子列表,但每个节点都指向它的父节点。 root reference 是一个方便的字段,用于引用树的根节点。例如,删除整棵树会更容易。现在我有很多 Node 的后代,比如 A , B C , 等等。

问题:

尝试持久化整个树时,我使用以下代码。

    // Check for extraneous references, and sort them topologically.
Session s = hibernate.openSession();
Transaction tx = s.beginTransaction();
try {
int i = 0;
for (Node p: objects) {
if (p.parent == null) {
throw new IOException("Parent is `null`.");
}
s.persist(p);
if (i % batchSize == 0) {
s.flush();
s.clear();
}
i++;
}
tx.commit();
}
catch (Throwable t) {
log.error(t.getMessage(), t);
tx.rollback();
throw new IOException(t);
}

此方法不能正确持久化对象。如果批量太小,我会得到 PersistentObjectException有一条消息:
org.hibernate.PersistentObjectException: detached entity passed to persist: com.example.Node

如果批量大小至少与我可以坚持的对象总数一样大,但是 PARENT_IDROOT_ID在数据库中全部设置为 null .我在测试时使用 H2。注意,类(class) A始终是根节点,所有其他对象可以出现在 A 以下的任何级别.我试过 s.merge() ing 也是,但这也不起作用。我已实现 equals()hashCode()根据我的业务键。

我的 equals/hashCode 方法有问题吗?或者这是我试图坚持的方式?我不知道我的代码有什么问题。不知何故,我觉得这是一个微不足道的错误,我忽略了基本方面。有人可以帮我解决吗?我尝试阅读不同的博客,这些博客讨论使用 Hibernate 的分层表示,但没有任何帮助。

最佳答案

尝试删除 s.clear() .

它基本上是从持久化上下文中分离对象,这可能会导致异常 detached entity passed to persist

关于java - Hibernate:持久化树状结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24156130/

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