我必须使用EclipseLink实现父子树。
以下代码编译好,自动生成合理的DDL代码,但 children 字段始终解析为空集,并且跟踪显示无查询执行填补这个领域。
@Entity
public class TreeNode {
@Id @GeneratedValue
private int id;
private TreeNode parent;
@OneToMany(mappedBy="parent")
private Set<TreeNode> children;
}
答案 0 :(得分:0)
AddNode似乎会保留子节点,但如果它不在托管父节点上工作,则需要合并父节点,以便同时存储对集合的更改。否则,对父项所做的更改不会存储在缓存中,因此在从数据库刷新之前,它不会显示任何更改。
答案 1 :(得分:0)
实际上,真正的类结构并不那么简单,这也是EclipseLink中问题的根源:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
abstract class TreeNode {
@Id int id;
private TreeNode parent;
@OneToMany(mappedBy="parent")
private Set<TreeNode> children;
}
abstract class NamedNode extends TreeNode { String name, title; }
class ConcreteNode1 extends NamedNode { ... some concrete fields }
class ConcreteNode2 extends NamedNode { ... some concrete fields }
....
只应该实例化ConcreteNodeXXX类,并且所有类都应该从抽象NamedNode类继承名称和标题字段。 EclipseLink没有抱怨,但无法处理从几个表中读取子项。
所以最终,我切换到了Hibernate,到目前为止它很好地处理了这个构造。