Java 我在a和B之间有一种单一的关系,但当我得到B()时,我就没有了';无法获取多行

Java 我在a和B之间有一种单一的关系,但当我得到B()时,我就没有了';无法获取多行,java,hibernate,collections,Java,Hibernate,Collections,甲级 当我执行getB()时,我只得到一行,其中对于INT_C和SBC_C的组合,有3行 请让我知道这里出了什么问题 @ManyToOne(fetch = FetchType.EAGER) @JoinColumns({ @JoinColumn(name = "INT_C", nullable = false, insertable = false, updatable = false), @JoinColumn(name = "SBC_C"

甲级

当我执行
getB()
时,我只得到一行,其中对于
INT_C
SBC_C
的组合,有3行

请让我知道这里出了什么问题

@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;
B实体Id:

    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
ObFileId类:

@EmbeddedId
    private ObFileId id;

当您计划在
集合
中添加对象时,例如
集合
,您必须覆盖
equals()
hashCode()
方法,以便系统可以比较两个实例并检测它们是否相等。在
集合
中,您不能有重复的实例,因此当您添加一个实例并且
集合
中的另一个实例等于该实例时,第二个实例将不会添加到
集合

带有
int
作为
id
equals()
方法的一个示例,它完美地标识了实例(主键):

以及一种可能的
hashCode()
方法:

@Override
public boolean equals(Object o) {
    if (o instanceof B) {
        B b = (B)o;
        return b.id == this.id;
    }
    return false;
}
尝试更多地了解这两种方法,因为它们在java编程中非常重要,尤其是在JPA/Hibernate中

编辑:

Embeddeble类包含2个字段,但它不是B表的主键,因为这3行中这2个字段的值完全相同。这3行被视为相等,在
集合中第一次插入后,其他2行不被添加


将构成B表主键的所有字段添加到可嵌入类中,并修改
equals()
hashCode()
方法以包含新字段(
FILE\u C
字段可能是唯一缺少的字段)。然后,应将行视为不同的行,并将每一行添加到
集中

我在那里犯了一个错误,代码是:类a:@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy=“outboundInterface”)私有集Bs=new HashSet();B类:@ManyToOne(fetch=FetchType.EAGER)@JoinColumns({@JoinColumn(name=“INTF_C”,nullable=false,insertable=false,updateable=false),@JoinColumn(name=“SBCR_C”,nullable=false,insertable=false,updateable=false)}私有A;当我执行getB()时,我应该得到3行,因为数据库中有3行,但我只得到一行。编辑您的问题,而不是添加注释。注释中的代码确实很难阅读,而您可以在有问题的文本中对其进行格式化。您是否覆盖了B类的equals()hashcode()方法?在
集中插入实例时,这一点非常重要。如果您覆盖了它们,请将代码添加到您的问题中。还要添加表中的行。否。我在里面放什么。请举个例子。对于sbcr_c='MYACCESS'和intf_c='ACR'有3个文件代码,它应该返回,目前它返回输出文件名的第一行值。我用您添加到问题中的可嵌入类的信息编辑了我的答案。请您将此与此帐户断开链接。
@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())));
}
@Override
public boolean equals(Object o) {
    if (o instanceof B) {
        B b = (B)o;
        return b.id == this.id;
    }
    return false;
}
@Override
public int hashCode() {
    return new Integer(id).hashCode();
}