0

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

为什么?

4

3 回答 3

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 () {}
}
于 2020-10-01T14:29:54.743 回答
0

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

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注释一起使用是一种很好的做法。这将在设置导致它们在您尝试检索时丢失的值时停止错误。

于 2019-07-12T16:50:33.810 回答
-1

fetch= FetchType.LAZY

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

于 2013-10-23T14:42:32.713 回答