23.3. 顧客/注文/製品
この章では、
Customer
、Order
、 LineItem
、 Product
の関係を表すモデルを考えてみましょう。Customer
と Order
は一対多の関連ですが、Order
/ LineItem
/ Product
はどのように表現するべきでしょうか? この例では、LineItem
を、Order
と Product
の多対多関連を表現する関連クラスとしてマッピングしました。Hibernate ではこれを複合要素と呼びます。
このマッピングドキュメントは以下のようになります:
<hibernate-mapping> <class name="Customer" table="customers"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="orders" inverse="true"> <key column="customer_id"/> <one-to-many class="Order"/> </set> </class> <class name="Order" table="orders"> <id name="id"> <generator class="native"/> </id> <property name="date"/> <many-to-one name="customer" column="customer_id"/> <list name="lineItems" table="line_items"> <key column="order_id"/> <list-index column="line_number"/> <composite-element class="LineItem"> <property name="quantity"/> <many-to-one name="product" column="product_id"/> </composite-element> </list> </class> <class name="Product" table="products"> <id name="id"> <generator class="native"/> </id> <property name="serialNumber"/> </class> </hibernate-mapping>
customers
、 orders
、 line_items
、 products
はそれぞれ、顧客、注文、注文明細、製品のデータを保持します。 line_items
は注文と製品をリンクする関連テーブルとしての役割も果たします。
create table customers ( id BIGINT not null generated by default as identity, name VARCHAR(255), primary key (id) ) create table orders ( id BIGINT not null generated by default as identity, customer_id BIGINT, date TIMESTAMP, primary key (id) ) create table line_items ( line_number INTEGER not null, order_id BIGINT not null, product_id BIGINT, quantity INTEGER, primary key (order_id, line_number) ) create table products ( id BIGINT not null generated by default as identity, serialNumber VARCHAR(255), primary key (id) ) alter table orders add constraint ordersFK0 foreign key (customer_id) references customers alter table line_items add constraint line_itemsFK0 foreign key (product_id) references products alter table line_items add constraint line_itemsFK1 foreign key (order_id) references orders