JPA mappedByプロパティ

1193 ワード

JPA,@OneToManyにmappedBy属性を加えて中間テーブルの生成を避ける
JPAを使用する場合、A Bの2つのエンティティ間が1対多、多対一の関係である場合、@OneToManyにmappedByプロパティ(inverse="true")を追加しないと、余分な中間テーブルが自動的に生成されます.例:
 
@Entity public class A { @OneToMany(mappedBy="a") public Set<B> bs = new HashSet<B>(0); } @Entity public class B { @ManyToOne public A a; }  

このように書くと、テーブルAとテーブルBが生成され、BにはテーブルAへの外部キーが1つしか生成されません.ただしmappedBy="a"を付けないと、もう1枚A_が生成されますB表 
次のようになります.
In Customer class

@OneToMany(cascade=ALL, mappedBy="customer")
public  Set getOrders() { 
	return orders; 
}


In Order class

@ManyToOne
@JoinColumn(name="CUST_ID", nullable=false)
public Customer getCustomer() { 
	return customer; 
}

 
mappedBy="customer"は、2つの関連付けられたエンティティBeanにおいてordersの一端が関係の所有者であることを示し、Ordersの一方のテーブルで関連付けられたクラスの外部キーが生成され、mappedByは双方向に関連付けられている場合にのみ、この属性cascade=ALL説明が使用され、OrdersがCRUD操作を行う場合、Customerは対応する操作を行う
ペアが多い場合、mappedBy(被所有者)は外部キーを含まず、他方は外部キー(所有者)を含む
多対多の場合、所有者と他の所有者はそれぞれの外部キーを含まない(中間表で関連付けられている)ため、実際のニーズに応じて両端の所有状況を設定できる(柔軟)
optional=falseはnot-nullを表し、lazyとは関係ありません