我遭遇了一种非常奇怪的行为,我在两个实体(A,B)之间有一对多的关系。当我添加一个元素(B)时,一切都很好。但是只要我添加第二个(B1)。在数据库上创建寄存器,我可以看到指向同一实体的两个实体(A)。 “但是”一旦我检索到A,我就可以看到列表中只有第一个A,并且所有属性都为null但是id。我的关系是这样的:
@OneToMany(cascade = {CascadeType.ALL}, orphanRemoval = true)
@JoinColumn(name = "a_id")
@XmlElement
@Getter
@Setter
private List<B> Bs = new ArrayList<>();
@ManyToOne
@JoinColumn(name = "a_id")
@Getter @Setter
private A a;
这里有什么问题?
解决方案:是我的错,我的B1上的枚举值之一是不行的,Hibernate没有抱怨它。尝试直接从数据库中获取值而没有A我收到异常。
问候。
答案 0 :(得分:1)
您在A&gt;上的映射不正确B:
public class A{
@OneToMany(mappedBy="a", cascade = {CascadeType.ALL}, orphanRemoval = true)
private List<B> Bs;
}
public class B{
@ManyToOne
@JoinColumn(name = "a_id")
private A a;
}
正如另一个答案中所建议的那样,如果你将B添加到A并持续A,那么设置关系的两边。您应该封装添加/删除操作以强制模型的完整性。
public class A{
@OneToMany(mappedBy="a", cascade = {CascadeType.ALL}, orphanRemoval = true)
private List<B> Bs;
public List<B> getBs(){
return Collections.unmodificableList(Bs);
}
public void addB(B b){
b.setA(this);
Bs.add(b);
}
}
答案 1 :(得分:0)
我们需要您的服务代码才能确定问题所在。但是,我的猜测是你没有将b1
添加到A
的{{1}}列表中。如果是这种情况,那么Bs
的下一个查询就是从缓存中返回它,其中列表中没有A
。
底线是,如果我的假设是正确的,你需要处理双向关系的双方。
b1
答案 2 :(得分:0)
我有同样的问题。就我而言,问题是错误的equals / hashcode方法(对于Hibernate,由于上述方法存在问题,两个数据库对象具有相同的实体-因此,它仅返回其中一个)