2017-12-15 18 views
0

@OneToMany注釈は、デフォルトでは、mappedBy要素が指定されていない限り、結合表を作成します。@OneToManyに対して、HibernateがデフォルトでJoin Tableを作成するのはなぜですか?

この動作の理由は何ですか?たとえば、次のエンティティを持つ:

@Entity 
public class User { 
    // ... 
    @OneToMany 
    private List<UserDocument> documents; 
    // ... 
} 

@Entity 
public class UserDocument { 
    // ... 
    @ManyToOne 
    private User user; 
    // ... 
} 

単に休止しない理由User実体について:

  1. UserDocumentエンティティ上で反射を実行して、タイプUserDocumentUserを持つフィールドを検索します。
  2. @OneToMany注釈の値をmappedByと推測しますか?

これを実行せず、デフォルトの動作として結合テーブルを生成する理由は何ですか?なぜHibernate(JPA)はこのように設計されていますか? UserDocument関係 - この背後にある

+0

こんにちは。 @OneToManyアノテーションのmappedByの値を推測するとはどういう意味ですか?また、Hibernateが与えられたエンティティ(id)を計算するという意味でデザインを作成するという意味でHibernateが "やっている"ことについて話しているときは、明確ではありません。つまり、 "find"/"infer"より明確に編集してください。すべてを明確に参照するのに十分な言葉と文章を使用してください。 PS答えは、テーブル上の抽象オペレーションと特定の場合にそれらがどのように組み合わされているかを区別することです。また、注釈ごとのドキュメンテーション・マッピング・モデルを表に読み込みます。 – philipxy

+0

なぜ、JPA SPECはそれを1-NのDEFAULTとして命令しますか?それはそうだから。 JPA仕様を読んでください。それは "mappedBy"とは関係ありません。それは '@ JoinColumn'がないためです。 – DN1

+0

@philipxy私はデザインの意思決定について話しています。なぜ、Hibernate(あるいはむしろJPA)がこのように設計されているのですか? – Utku

答えて

3

単純な理由は、HibernateがUserDocumentの内側種類Userの分野の特定Userに対応していることを確認のために知られていないということです。 mappedByプロパティがなければ、Hibernateは結合テーブルを作成するか、または生成されたカラムをUserDocumentテーブルに挿入することしかできません。しかし、後者はデータモデルを変更し、解決されるよりも多くの問題(生成された列または宣言された列、表スキーマの不一致モデルのクラスなどを区別します)を導入します。したがって、Hibernateは、マッピングを格納するために結合テーブルを使用します。

たとえば、文書を最後に変更した人物を追跡する場合は、UserDocumentにもう1対多の関係が必要な場合があります。これは、リフレクションだけでは推論や解決ができません。

@Entity 
public class UserDocument { 
    // ... 
    @ManyToOne 
    private User user; 

    @ManyToOne 
    private User lastModifiedBy; 
    // ... 
} 
関連する問題