繁体   English   中英

JPA - OneToMany 关系未加载子项

[英]JPA - OneToMany relationship not loading children

我正在尝试配置此 @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 :

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

为什么?

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

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

附注。 @JoinColumn(name = "fk_parent_id", nullable = false)@ManyToOne注释一起使用是一种很好的做法。 这将在设置值时停止错误,这导致您在尝试检索时未命中。

所有实体都需要有一个@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 () {}
}

fetch=FetchType.LAZY

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM