1

私のプロジェクトには、必須テーブルという非常に重要なテーブルがあります。いくつかの列がありますが、この場合最も重要なのは主キーです。

Mandatory
1. id (Long Primary Key)
...

ここで、2 つの新しいテーブルを追加する必要があります。追加テーブルと追加テーブルです。どちらも 2 つの列しかありません。追加では、両方が主キーです。ご覧のとおり、それらの1つは外部キーでもあります。

Additional
1. mandatory_id (Long Primary Key FK -> Mandatory.id)
2. description (Varchar(512) Primary Key)

Extra テーブルでは、主キーは外部キーでもあります。

Extra
1. mandatory_id (Long Primary Key FK -> Mandatory.id)
2. text (Varchar(512) 

Hibernate を使用してプロジェクトに実装する方法を検討しています。

私はこの方法でそれらを宣言しました(ここではゲッター、セッターなどなし)、MandatoryEntityクラス:

@Entity
@Table(name = "mandatory")
public class MandatoryEntity {

    @OneToMany
    @JoinColumn(name = "mandatory_id")
    protected List<AdditionalEntity> additonals;

    @OneToOne
    @JoinColumn(name = "mandatory_id")
    protected ExtraEntity extra;
}

AdditionalEntityクラス:

@Entity
@Table(name = "additional")
public class AdditionalEntity {

    @EmbeddedId
    private AdditionalPK id;

    @ManyToOne(fetch = FetchType.LAZY)
    @Fetch(value = FetchMode.JOIN)
    @JoinColumn(name = "mandatory_id", nullable = false, insertable = false, updatable = false)
    protected MandatoryEntity mandatory;
}

AdditionalPKクラス:

@Embeddable
public class AdditionalPK {

    @Column(name = "mandatory_id")
    private Long mandatoryId;

    @Column(name = "description")
    private String description;
}

ExtraEntityクラス:

@Entity
@Table(name = "extra")
public class ExtraEntity {

    @Id
    @Column(name = "mandatory_id")
    private Long id;

    @OneToOne 
    @PrimaryKeyJoinColumn
    protected MandatoryEntity mandatory

    @Column(name = "text")
    protected String text;
}

現時点では、私が作業しているラップトップが壊れているため、検討する時間があります。JPA仕様の@SecondaryTables注釈で見つけました。私の場合、この注釈を使用できますか? これらは 2 つのテーブルだけで、それぞれに 2 つの列しかありません。1 つ目は複合主キーを持ち、2 つ目はそうではありません。

たぶん、このテーブルを1つに実装する別の方法がありMandatoryEntityますか? 2 つの新しいエンティティがない場合:AdditionalEntityおよびExtraEntity?

4

1 に答える 1

1

まず、あなたの要求から私が理解したことを言い換えさせてください。

  1. あなたは主実体を持っています (必須)
  2. Mandatory エンティティに追加情報を指定するエンティティが他に 2 つあります。そのうちの

    を。付加情報を複数指定可能(ManyToOne)

    b. Extra情報を1つ指定可能(OneToOne)

一般に、これは非常に基本的なユースケースです。ここで決定しなければならないことの 1 つは、双方向マッピングが必要かどうか、または単方向マッピング (必須エンティティを介したアクセスのみ) で十分かどうかです。Mandatory がルート エンティティのように見えるため、単方向マッピングがユースケースに適していると思います。あなたのコードでは、双方向の関係をモデル化しようとしましたが、逆を指定するのを忘れていました。これにより、実際には 2 つの独立した関係が生じます。次のように、双方向リレーションのターゲットを指定する必要があります。


@Entity
@Table(name = "mandatory")
public class MandatoryEntity {
    // you need a mapped by to mark the relation as bidirectional
    @OneToMany(mappedBy = "mandatory")
    protected List additonals;
    @OneToOne
    protected ExtraEntity extra;
}

@Entity @Table(name = "additional") public class AdditionalEntity { @EmbeddedId private AdditionalPK id; @ManyToOne(fetch = FetchType.LAZY) protected MandatoryEntity mandatory; }

また、例では必要のない多くの追加のマッピング情報を指定したため、すべてが複雑すぎるように見えます。また、なぜ埋め込みキーを使用しているのですか? 自動生成されたキーも同様に機能すると思います。あなたのモデルに対する私の提案は次のとおりです。


@Entity
@Table(name = "mandatory")
public class MandatoryEntity {
    @Id
    @GeneratedValue(strategy =  GenerationType.AUTO)
    private Long id;
// you need a mapped by to mark the relation as bidirectional
    @OneToMany(mappedBy = "mandatory")
    protected List additonals;
    @OneToOne
    protected ExtraEntity extra;
}
@Entity
@Table(name = "additional")
public class AdditionalEntity {
    @Id
    @GeneratedValue(strategy =  GenerationType.AUTO)
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)
    protected MandatoryEntity mandatory;
}
@Entity
@Table(name = "extra")
public class ExtraEntity {
    // you might also not use auto-value here and set the id to the id of the owning
    // mandatory entity
    @Id
    @GeneratedValue(strategy =  GenerationType.AUTO)
    private Long id;
    @Column(name = "text")
    protected String text;
}

いくつかの要件が不足しており、提案されたマッピングがお客様のケースで機能しない場合は、お客様の要件に関する情報を追加してください。これについてさらに話し合うことができます。

于 2012-10-30T13:53:43.050 に答える