0

A2 つのエンティティとを例に取りましょうB。それぞれAに多数の が関連付けられている場合がありますB。それぞれBが正確に 1 つの に関連付けられていAます。この Hibernate との関係を次のように表します。

@Entity
public class A {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "AId")
    private Long id;

    @Column(name = "AName", nullable = false, unique = true)
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "AId") }, inverseJoinColumns = { @JoinColumn(name = "BId") })
    private Set<B> bs = new HashSet<B>();

}


@Entity
public class B {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "BId")
    private Long id;

    @Column(name = "BName")
    private String name;

    @ManyToOne(optional = false)
    @JoinColumn(name = "BA")
    private A a;

}

このマッピングから DB を生成すると、次のようになります。

  • A
  • A_B2 つの列を持つ結合テーブル:AIdBId. AId主キーにBId属します。また、からへのOneToMany関連付けがあるため(つまり、1 つの に多数の が関連付けられていて、1 つは 1 つの にのみ関連付けられている)、一意の制約が に追加されます。ABABBABId
  • tableのキー参照列である which をB含む列を含むテーブル。BAforeignAIdA

についてはjoin table

  • OneToManyHibernate が関係をこのようにマッピングするのはなぜですか?
  • 主キーを 1 つの列 ( BId) で構成されるように定義するだけで、同じ規則が適用されます。
  • マッピングがこのように行われる理由はありますか?
  • このようなマッピングの利点/欠点は何ですか?

私は正確に私が使用してHibernate 4.1.6.Finalいます。

4

1 に答える 1

0

AからBへ、BからAへの双方向の関連付けをマッピングしようとしているようです。

結合テーブルに関して、HibernateがOneToMany関係をこのようにマップするのはなぜですか?

結合テーブルを指定したためです。@OneToManyリレーションは、それなしでマップできます。

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "AId", nullable = false)
private Set<B> bs = new HashSet<B>();

双方向の関連付けがあるため、またはそれ以上です。

@OneToMany(cascade = CascadeType.ALL, mappedBy = "a")  
private Set<B> bs = new HashSet<B>();

..。

@ManyToOne(optional = false)  
@JoinColumn(name = "AId", nullable = false)  
private A a;

それにかんする

マッピングがこのように行われる理由はありますか?そのようなマッピングの利点/欠点は何ですか?

結合テーブルを使用したマッピングは、たとえばBにAがない場合など、オプションの1対多がある場合に役立ちます。これにより、Bテーブルのnull許容AId列を回避できます。

于 2012-08-23T15:16:12.197 に答える