0

jpa の 2 つのクラスを OneToOne 関係で関連付けようとしています。この複合キーを持つクラス A があります。

@Embeddable
public static class AId implements Serializable 
{
  private static final long serialVersionUID = -3668842379109008885L;
  private long idA;
  private String codType;
  private Date startDate;



    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((codType == null) ? 0 : codType.hashCode());
        result = prime * result + (int) (idA ^ (idA >>> 32));
        result = prime * result
                + ((startDate == null) ? 0 : startDate.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        AId other = (AId) obj;
        if (codType == null) {
            if (other.codType != null)
                return false;
        } else if (!codType.equals(other.codType))
            return false;
        if (idA != other.idA)
            return false;
        if (startDate == null) {
            if (other.startDate != null)
                return false;
        } else if (!startDate.equals(other.startDate))
            return false;
        return true;
    }
    public long getIdA() {
        return idA;
    }
    public void setIdA(Long idA) {
        this.idA = idA;
    }
    public String getCodType() {
        return codType;
    }
    public void setCodType(String codType) {
        this.codType = codType;
    }
    public Date getStartDate() {
        return startDate;
    }
    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

}

@EmbeddedId
@AttributeOverrides({
    @AttributeOverride(name="idA", column=@Column(name="ID_A")),
    @AttributeOverride(name="codType", column=@Column(name="COD_TYPE")),
    @AttributeOverride(name="startDate", column=@Column(name="START_DATE"))
})
private AId idAId;

単純な主キーを持つクラス B

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="GEN_ID_STORE"  )
@Column(name="ID")
private Long id;
@OneToOne(fetch=FetchType.EAGER)
private A a;

ここで私の質問は、idAId.idA フィールドのみを使用してこれら 2 つのクラスを関連付けるにはどうすればよいかということです。B テーブルには ID_A 列のみを配置し、他の列は配置したくないためです。私の問題は、codType = 'COD' および startDate = null のレコードのみをテーブル A から取得する必要があることです。実際、他の 2 つのキーは固定されているため重要ではありません。私に何ができる?

ブリッジテーブルは許可されていません:D

ご協力いただきありがとうございます。

4

1 に答える 1

1

B テーブルに ID_A 列のみを配置し、他の列は配置したくないため

それが複合キーに関する私の主な問題です。1 つのテーブルに複合キーがある場合、これは、これらすべてのキーが一緒になって 1 つのレコードを定義することを意味します。したがって、この 1 つのレコードを別のテーブルで参照する必要がある場合は、すべてのキーが必要です。

要するに、テーブル A に複合主キーがある場合、テーブル A のレコードへの参照を含むテーブル B のフィールドを 1 つだけ持つことはできません。

于 2012-08-21T07:57:40.273 に答える