0

クラス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()と、1行しか取得できませんが、 と の組み合わせについてはINT_CSBC_C3行が存在します。

ここで何が問題なのか教えてください。

    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())));
}
4

1 に答える 1

0

Collectionsに などのオブジェクトを追加する場合は、およびメソッドをSetオーバーライドして、システムが 2 つのインスタンスを比較し、それらが等しいかどうかを検出できるようにする必要があります。では、重複することはできないため、インスタンスを追加し、 内の別のインスタンスがそのインスタンスと等しい場合、2 番目のインスタンスは に追加されません。equals()hashCode()SetsSetSet

インスタンス (主キー) を完全に識別するasを使用equals()したメソッドの例:intid

@Override
public boolean equals(Object o) {
    if (o instanceof B) {
        B b = (B)o;
        return b.id == this.id;
    }
    return false;
}

そして可能なhashCode()方法:

@Override
public int hashCode() {
    return new Integer(id).hashCode();
}

これら 2 つのメソッドについて詳しく学んでみてください。これらは Java プログラミング、特に JPA/Hibernate で非常に重要だからです。

編集:

埋め込み可能なクラスには 2 つのフィールドが含まれていますが、B テーブルの主キーではありません。これは、3 つの行がこれら 2 つのフィールドに対してまったく同じ値を持っているためです。3 つの行は等しいと見なされ、 に最初に挿入された後Set、他の 2 行は追加されません。

B テーブルの主キーを構成するすべてのフィールドを埋め込み可能なクラスに追加し、equals()メソッドhashCode()を変更して新しいフィールドを含めます ( FILE_Cfield は一意の欠落フィールドである可能性があります)。次に、行は異なると見なされ、それぞれが に追加されますSet

于 2013-07-02T21:02:42.940 に答える