OneToMany关系仅返回一个元素

时间:2014-12-05 11:45:57

标签: java spring hibernate spring-mvc

我遭遇了一种非常奇怪的行为,我在两个实体(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我收到异常。

问候。

3 个答案:

答案 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,由于上述方法存在问题,两个数据库对象具有相同的实体-因此,它仅返回其中一个)