@ManyToOne关系永远不会读

时间:2011-04-22 17:09:29

标签: jpa-2.0 eclipselink

我必须使用EclipseLink实现父子树。

以下代码编译好,自动生成合理的DDL代码,但 children 字段始终解析为空集,并且跟踪显示无查询执行填补这个领域。

@Entity
public class TreeNode {
  @Id @GeneratedValue
  private int id;

  private TreeNode parent;

  @OneToMany(mappedBy="parent")
  private Set<TreeNode> children;
}

2 个答案:

答案 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,到目前为止它很好地处理了这个构造。