我正在尝试配置这个@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();
为什么?
答案 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
您的收藏品未加载且交易已结束。