我在A到B之间有一个OneToMany关系。但是当我执行getB()时,我没有得到多行

时间:2013-07-02 20:24:44

标签: java hibernate collections

A类

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "A")
    private Set<B> Bs = new HashSet<B>();

B类

@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns({
            @JoinColumn(name = "INT_C", nullable = false, insertable = false, updatable = false),
            @JoinColumn(name = "SBC_C", nullable = false, insertable = false, updatable = false) })
    private A a;

当我执行getB()时,我只会获得一行,而INT_CSBC_C的组合则会有3行。

请告诉我这里有什么问题。

    Rows in DB

    SBC_C  INT_C FILE_C      OUTPUT_FILE_NM 
     --------------------------------------------
    MYACCESS  CR   CRC        DataHub_DEVC.dat  
    MYACCESS  CR   CRG        DataHub_DEVG.dat  
    MYACCESS  CR   CRU        DataHub_DEVU.dat

B实体ID:

@EmbeddedId
    private ObFileId id;

ObFileId类:

@Embeddable
public class ObFileId implements IXDomain {

@Override
public int hashCode() {
    return getICode().hashCode() + getSCode().hashCode();
}

@Override
public boolean equals(Object obj) {
    return ((obj instanceof ObFileId)
            && (getICode().equals(((ObFileId) obj)
    .getICode())) && (getSubscriberCode()
    .equals(((ObFileId) obj).getSCode())));
}

1 个答案:

答案 0 :(得分:0)

当您计划在Collections中添加对象时,例如Set,您必须覆盖equals()hashCode()方法,以便系统可以比较2个实例和检测它们是否等于。在Sets中,您不能有重复项,因此当您添加实例而Set内的另一个实例等于该实例时,第二个实例不会被添加到{{1} }。

Set方法的一个示例,equals()int,它完全标识了实例(主键):

id

可能的@Override public boolean equals(Object o) { if (o instanceof B) { B b = (B)o; return b.id == this.id; } return false; } 方法:

hashCode()

尝试更多地了解这两种方法,因为它们在java编程中非常重要,特别是对于JPA / Hibernate。

修改

embeddable类包含2个字段,但它不是B表的主键,因为3行对这2个字段具有完全相同的值。 3行被视为等于,在@Override public int hashCode() { return new Integer(id).hashCode(); } 中第一次插入后,其他2行未添加。

将构成B表主键的所有字段添加到您的可嵌入类中,并修改您的Setequals()方法以包含新字段(hashCode()字段可以是独特的遗失领域)。然后应将这些行视为不同,并将每一行添加到FILE_C