1

プロジェクトでHibernateを使用することに本当に行き詰まりました。ここで説明したいくつかの問題: Hibernate: 取得する行数が多すぎます。自分のコードが正しいかどうか疑問に思い始めました。私は巨大なプロジェクトに取り組んでおり、自分で注釈付きのマッピング クラスを定義する必要がありました。しかし、問題が発生し始めたとき、プロジェクトとは別にデータベースの一部を再作成し、IDE でエンティティを生成しようとしました。

と の 2 つのテーブルがMyありOptionます。My主キー: columnqwertyおよびがありpropertyます。テーブルPropertyからの外部キーです。Optionもちろん、主キーとしてOption持っています。property

私のソリューションでは、 と の 2 つのプロパティを持つクラスを作成し@Embeddable MyPKました。私のエンティティではもちろんと( と同じ列名) がありますが、このオブジェクトは のように String ではなく、です。String qwertyString propertyMy@EmbeddedId MyPKpropertyMyPKOptionMyPK

@ManyToOne
@JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
protected Option option;

これは、Intellij Idea の Hibernate Tools によって生成されたエンティティです。ありませんEmbeddedIdが、あります@IdClass@IdClass私はそれが基本的なタイプだけだと思っていました。しかし、主キーの一部としてオブジェクトがあります。しかし、ここにもOptionEntity目的があります。基本型とオブジェクト型を 1 つの列に保持するのは正しいですか?

@javax.persistence.IdClass(test.go.MyEntityPK.class)
@javax.persistence.Table(name = "MY", schema = "PUBLIC", catalog = "PUBLIC")
@Entity
public class MyEntity {
    private String qwerty;

    @javax.persistence.Column(name = "QWERTY")
    @Id
    public String getQwerty() {
        return qwerty;
    }

    public void setQwerty(String qwerty) {
        this.qwerty = qwerty;
    }

    private String text;

    @javax.persistence.Column(name = "TEXT")
    @Basic
    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    private String lang;

    @javax.persistence.Column(name = "PROPERTY")
    @Id
    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property= property;
    }

    @Override
    public boolean equals(Object o) {
        //equals
    }

    @Override
    public int hashCode() {
        //hashCode
    }

    private OptionEntity optionByProperty;

    @ManyToOne
    @javax.persistence.JoinColumn(name = "PROPERTY", referencedColumnName = "PROPERTY", nullable = false)
    public OptionEntity getOptionByProperty() {
        return optionByProperty;
    }

    public void setOptionByProperty(OptionEntity optionByProperty) {
        this.optionByProperty = optionByProperty;
    }
}

これはMyEntityPK生成されたクラスです:

public class MyEntityPK implements Serializable {
    private String qwerty;

    @Id
    @Column(name = "qwerty")
    public String getQwerty() {
        return qwerty;
    }

    public void setQwerty(String qwerty) {
        this.qwerty = qwerty;
    }

    private String property;

    @Id
    @Column(name = "PROPERTY")
    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }

    @Override
    public boolean equals(Object o) {
        //equals
    }

    @Override
    public int hashCode() {
        //hashCode
    }
}

OptionEntity下。このエンティティには特別なポイントはありません。の代わりに、プロパティの@Version注釈のみが必要です。versionList<MyEntity>Collection<MyEntity>

@javax.persistence.Table(name = "OPTION", schema = "PUBLIC", catalog = "PUBLIC")
@Entity
public class OptionEntity {
    private Long version;

    @javax.persistence.Column(name = "VERSION")
    @Basic
    public Long getVersion() {
        return version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    private String property;

    @javax.persistence.Column(name = "PROPERTY")
    @Id
    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }

    @Override
    public boolean equals(Object o) {
        //equals
    }

    @Override
    public int hashCode() {
        //hashcode
    }

    private Collection<MyEntity> myByProperty;

    @OneToMany(mappedBy = "optionByProperty")
    public Collection<MyEntity> getMyByProperty() {
        return myByProperty;
    }

    public void setMyByProperty(Collection<MyEntity> myByProperty) {
        this.myByProperty = myByProperty;
    }
}

最も適切で問題の少ないオプションはどれですか? 私が説明したもの、または貼り付けたもの?

4

2 に答える 2

1

プロパティを削除しますprivate String lang;/private String property;それはすでにmanytooneによって定義されています。MyEntityの主キーのクラスも必要ありません。qwertyMyEntityは、2つのプロパティを持つ独自のidクラスにすることができ、optionそのキープロパティとしてkey-manytooneにすることができます。

于 2012-10-12T12:19:10.330 に答える
1

派生 ID を使用した JPA 2.0 の例を確認してください: http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers

JPA では、ID に embeddedId は必要ありませんが、複合 PK を使用する場合は、PK を構成する複数の値を保持するクラスが必要です。このクラスのインスタンスは em.find メソッドに渡され、EmbeddedId または PKClass のいずれかになります。私は PKClass を自分で使用することを好みますが、それはあなた次第です。埋め込みを使用すると、埋め込み可能なクラス内にフィールドが配置されるだけなので、埋め込みオブジェクトを使用してマッピングを設定し、値にアクセスします。pkClass を使用する場合、フィールド/プロパティはエンティティ内で直接アクセスおよびマッピングされるため、フィールド/プロパティに注釈を付ける必要はありません。

于 2012-10-12T14:03:59.570 に答える