2014-12-05 132 views
0

我正在遭受一个非常奇怪的行为我有两个实体(A,B)之间的一对多关系。当我添加一个元素(B)时,一切都可以。但只要我添加第二个(B1)。该寄存器是在数据库上创建的,我可以看到两个实体指向相同的实体(A)。 “但是”只要我检索到A,我可以看到列表中只有第一个A,并且所有属性都为空,但ID为。我的关系是这样的:OneToMany关系只返回一个元素

@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

我们需要您的服务代码能够确切知道问题所在。但是,我的猜测是,您没有将b1添加到ABs列表中。如果是这种情况,您的下一个A查询将从缓存中返回,其列表中没有b1。底线是,如果我的假设是正确的,你需要处理双向关系的双方。

B b1 = new B(); 
b1.setA(a); 
// I guess you are skipping this next step 
a.getBs().add(b1); 
save(a); 
+1

我已经这样做了,数据库上的实体它是正确的。这两个B都指向A.我认为这是Hibernate搞砸了 – paul 2014-12-05 12:20:27

+0

你可以发布你的服务代码的问题? – 2014-12-07 08:22:50

+0

它是固定的,最后不是hibernate映射问题,感谢 – paul 2014-12-07 10:52:57

1

您对A> 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和持久化,然后设置关系的两侧。您应该封装添加/删除操作以强制模型的完整性。

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

的帮助,我之前也有过这个映射,我尝试了一切。数据库上的实体是正确的。这两个B都指向A.我认为这是Hibernate搞砸了 – paul 2014-12-05 12:21:19