18

これはかなり素朴なはずですが、いつ使用するかについては疑問が@Entityあり@Embeddableます。

UserNotificationクラスがあるとしましょう。

 @Entity
 public class User{
     //other properties
     @onetomany
     private List<Notification> notifications;
 }

 @Entity
 public class Notification{
     //properties
 }

UserclassとNotification、のテーブルと、マッピング用の3番目のテーブルがあることを理解しています。このようにしたらどうなりますか?

 @Entity
 public class User {
     //other properties
     @ElementCollection
     private List<Notification> notifications;
 }

 @Embeddable
 public class Notification{
     //properties
 }

私はこれがのテーブルを作成しないことを知っていますNotification。ただし、通知オブジェクトは引き続き保存できます。ドキュメントを確認しましたが、いくつか疑問があります。

  1. クラスBを別のテーブルとして見たいかどうかに基づいていますか?
  2. テーブルと埋め込み可能オブジェクトを作成することでパフォーマンスに違いはありますか?
  3. テーブルを直接クエリする以外に、テーブルで実行できる埋め込み可能オブジェクトで実行できないことは何ですか?

ノート

この質問を読んでいる人にとって、この質問もあなたを助けるかもしれません。

4

2 に答える 2

10
  1. クラスBを別のテーブルとして見たいかどうかに基づいていますか?

はい、使用する@Embeddedと、その@Embeddableエンティティが@Entityクラスに埋め込まれます。これにより、クラスの同じテーブルに埋め込まれたエンティティの列が追加されます@Entity

  1. テーブルと埋め込み可能オブジェクトの作成でパフォーマンスの違いはありますか?

を使用する場合@Embedded、テーブルの作成には、行の挿入と選択にも 1 つのクエリが必要です。しかし、それを使用しない場合、複数のクエリが必要になるため、 を使用すると@Embeddedパフォーマンスが向上すると言えます。

  1. テーブルに直接クエリを実行する以外に、テーブルで実行できる埋め込みオブジェクトで実行できないことは何ですか?

それぞれの埋め込みエンティティを削除することは可能ですが、これには整合性制約違反がある可能性があります。

于 2012-10-04T07:31:59.523 に答える
0

JPA では、複合キー フィールドを作成する方法がいくつかあります。を使った方法を見てみましょう@Embeddable annotation
Entity クラスから始めましょう。

@Entity
@Table
public class TraceRecord {
    @Id
    private TraceRecordPk id;

    @Version
    @Transient
    private int version;

    @Column(columnDefinition = "char")
    private String durationOfCall;

    @Column(columnDefinition = "char")
    private String digitsDialed;

    @Column(columnDefinition = "char")
    private String prefixCalled;

    @Column(columnDefinition = "char")
    private String areaCodeCalled;

    @Column(columnDefinition = "char")
    private String numberCalled;
}

これは、@Id フィールドと @Version フィールド、およびいくつかの @Column 定義を持つ非常に単純な Entity クラスです。あまり詳しく説明しなくても、@Version フィールドにも @Transient という注釈が付けられていることがわかります。私のテーブルにはバージョンを追跡するための列もありませんが、データベースはジャーナル処理されているため、バージョン管理についてはあまり心配していません。また、@Column フィールドの columnDefinition 属性に「char」の値が設定されていることにも気付くでしょう。これは、テーブルのフィールドが varchar ではなく char として定義されているためです。それらが varchar の場合、文字列はデフォルトで varchar フィールドにマップされるため、これを行う必要はありません。

@Id私が今興味を持っている分野です。これは標準の Java 型ではなく、私が独自に定義したクラスです。これがそのクラスです。

@Embeddable
public class TraceRecordPk implements Serializable {

    private static final long serialVersionUID = 1L;

    @Temporal(TemporalType.DATE)
    @Column
    private Date dateOfCall;

    @Column(columnDefinition="char")
    private String timeOfCall;

    @Column(columnDefinition="char")
    private String callingParty;

    /**
     * Constructor that takes values for all 3 members.
     *
     * @param dateOfCall Date the call was made
     * @param timeOfCall Time the call was made
     * @param callingParty Extension from which the call originated
     */
    public TraceRecordPk(Date dateOfCall, String timeOfCall, String callingParty) {
        this.dateOfCall = dateOfCall;
        this.timeOfCall = timeOfCall;
        this.callingParty = callingParty;
    }
}

このクラスを Entity クラスの @Id フィールドにできるようにするには、前述のように @Embeddable で注釈を付ける必要があります。複合キー用に選択した 3 つのフィールドは、通常の @Column 定義です。フィールドごとに getter/setter を作成するのではなく、3 つのフィールドすべての値を受け取るコンストラクターを単純に実装して、インスタンスを不変にしました。@Embeddable でクラスにアノテーションを付ける場合、そのクラスは Serializable を実装する必要があります。そのため、対応するためにデフォルトの serialVersionUID を追加しました。

クラスを作成して で注釈を付けた@Embeddableので、それを Entity クラスの @Id フィールドの型として使用できるようになりました。簡単なことです。

于 2012-10-04T06:41:58.770 に答える