【问题标题】:@ManyToOne relation never read@ManyToOne 关系从未读过
【发布时间】:2011-04-22 17:09:29
【问题描述】:

我必须用 EclipseLink 实现父子树。

下面的代码编译好了,合理的 DDL 代码是自动生成的,但是 children 字段总是解析为一个空集,并且跟踪显示 没有执行过查询填写此字段。

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

  private TreeNode parent;

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

【问题讨论】:

  • 能把填孩子的代码放上来吗?
  • public void addNode(TreeNode child) { child.parent = this; getChildren().add(child); emf.persist(儿童); }
  • 填充数据库的代码运行良好:我可以通过普通 SQL 读取有问题的对象。奇怪的是程序没有发出任何查询:-(
  • 这些查询是在内部完成的。如果您使用的是 mysql,您可以使用 MyAdministrator 在查询日志中看到这些(启用跟踪它们的选项后)。
  • 不,我在 mysqld 上切换了 MySQL 日志记录,仍然没有查询 :-(

标签: jpa-2.0 eclipselink


【解决方案1】:

AddNode 似乎保留了子节点,但如果它不在托管父节点上工作,则需要合并父节点,以便同时存储对集合的更改。否则对 parent 所做的更改不会存储在缓存中,因此在从数据库刷新之前不会显示任何更改。

【讨论】:

    【解决方案2】:

    其实真正的类结构并没有这么简单,那就是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,到目前为止它很好地处理了这个结构。

    【讨论】:

    • 你提到它没有为孩子查询,所以我不明白为什么这会受到使用继承的影响 - 它似乎仍然与使用第二个 EclipseLink 有更多关系级缓存。您可以尝试刷新实体吗?如果孩子们仍然无法阅读,请向 EclipseLink 提交错误。否则,如果需要,可以禁用缓存,或者通过合并上述更改来保持一致。
    • 我刚刚启动程序,使用查询读取父对象,并探索了子槽。它包含一个统一化的集合,只要我在它上面调用任何集合方法而不执行任何数据库操作,它就会变成一个空集合。顺便说一句,如果我用另一个查询读取假定的孩子,他们在父字段中都有 NULL :-(
    猜你喜欢
    • 2023-02-03
    • 2016-03-20
    • 2013-08-20
    • 2017-11-13
    • 2015-06-06
    • 2010-11-28
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多