【问题标题】:JPA - OneToMany relationship not loading childrenJPA - OneToMany 关系不加载子级
【发布时间】:2013-06-15 16:25:14
【问题描述】:

我正在尝试配置此 @OneToMany 和 @ManyToOne 关系,但它根本不起作用,不知道为什么。我以前在其他项目上做过这个,但不知何故它不适用于我当前的配置,这是代码:

public class Parent {
   @OneToMany(mappedBy = "ex", fetch= FetchType.LAZY, cascade=CascadeType.ALL)
   private List<Child> myChilds;

   public List<Child> getMyChilds() {
         return myChilds;
   }
}

public class Child {
   @Id
   @ManyToOne(fetch=FetchType.LAZY)    
   private Parent ex;
   @Id
   private String a;
   @Id
   private String b;

   public Parent getParent(){
         return ex;
   }
}

一开始我以为是三重@Id注解导致了故障,但是去掉注解后还是不行。所以,如果有人有任何想法,我正在使用 EclipseLink 2.0。

我只是尝试用一些记录执行代码,它返回 s==0 always:

Parent p = new Parent();
Integer s = p.getMyChilds().size();

为什么?

【问题讨论】:

  • 不用放列名吗?
  • 什么列名?你能说得更具体点吗?
  • 你的关系双方都设置了吗? MyChilds 只有在添加条目或从数据库刷新父实体时才会有条目
  • 嗨,克里斯,感谢您的留言。是的,这就是重点,我使用 em.find 从数据库加载父级,但仍然得到相同的结果(什么都没有)。

标签: java jpa-2.0 eclipselink one-to-many many-to-one


【解决方案1】:

问题很可能出在您的保存中,因为您不能在要保存的子对象中设置父对象引用,也不能与您的检索或实体映射本身有关。 这可以从数据库行中确认,该行在您孩子的表的外键列中必须为空。例如正确保存

Parent p = new Parent();
Child child = new Child();
p.setChild(child);
child.setParent(p);
save(p);

PS. 最好将@JoinColumn(name = "fk_parent_id", nullable = false) 与@ManyToOne 注释一起使用。这将在设置导致它们在您尝试检索时丢失的值时停止错误。

【讨论】:

    【解决方案2】:

    所有实体都需要有一个@Id 字段和一个空的构造函数。

    如果您使用自定义 sql 脚本来初始化数据库,您需要在每个匹配外键的字段上添加注释 @JoinColumn:

    示例:

    class Parent {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private int id;
    
        public Parent() {}
    
        /* Getters & Setters */
    }
    
    class Child {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private int id;
    
    
        /* name="<tablename>_<column>" */
        @JoinColumn(name="Parent_id", referencedColumnName="id")
        private int foreignParentKey;
    
        public Child () {}
    }
    

    【讨论】:

      【解决方案3】:

      fetch= FetchType.LAZY

      您的收藏未加载,交易已结束。

      【讨论】:

      • 错了。如果你调用#getFoo,JPA 应该加载它,因为你要求它。
      猜你喜欢
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多