JPA - OneToMany关系没有加载孩子

时间:2013-06-15 16:25:15

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

我正在尝试配置这个@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();

为什么?

3 个答案:

答案 0 :(得分:0)

问题很可能出在您的保存中,因为您必须在要保存的子对象中设置父对象引用,而不要在您自己的检索或实体映射中设置父对象引用。 这可以从数据库行中确认,该数据库行在您孩子的表的外键列中必须为null。例如妥善保存

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注释一起使用。设置要导致他们在尝试检索时未命中的值时,这将停止错误。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

fetch = FetchType.LAZY

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