バイヤー用のBill for SaleOrderを作成するWebアプリケーションで、データベーステーブルを作成してマッピングを休止しようとしました。エンティティ間の関係は以下のとおりです。休止状態でのカスケード削除と1対1のマッピング
Aビルは、買い手とSaleOrder
A SaleOrderはバイヤーを持っていました。
SaleOrderを削除すると、関連付けられたBillを削除する必要があります。
私は、Javaクラスを実装のテーブルを作成しました。
スキーマでは、テーブルSALEORDERにFK列 'BUYER_ID'があります。 この表には、他の外部キー列はありません。 テーブルBILLには、2つの外部キーBUYER_IDとSALEORDER_IDがあります。
にはどうすれば1対1の関係を使用してビルとSaleOrderをマップや SaleOrderが削除された場合、法案も削除されていることを確認していますか?
SaleOrderテーブルにINVOICE_IDという外部キーがないため、が混乱しています。私はSaleOrder.hbm.xmlで次のようにどのようにマップできますか?
<!-- 1-to-1 modelled using n-to-n + unique -->
<many-to-one name="invoice" class="Invoice" column="INVOICE_ID" cascade="delete" unique="true">
</many-to-one>
私だけBill.hbm.xmlでマッピングを置けば、私はカスケード(SaleOrderが削除されたときに、ビルを削除する必要があります)を削除言及することができるでしょうか?
誰かが解決策を提案できることを願っています。
私のアプリケーションのクラスは、次のとおりです。
class Buyer{
private Long buyerId;
private String name;
...
}
class SaleOrder{
private Long saleOrderId;
...
private Buyer buyer;
...
}
class Bill{
private Long billId;
...
private Buyer buyer;
private SaleOrder saleOrder;
...
}
スキーマは次のとおりです。
CREATE TABLE BUYER(
BUYER_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
NAME VARCHAR(100)
);
CREATE TABLE SALEORDER(
SALEORDER_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
BUYER_ID BIGINT NOT NULL,
);
CREATE TABLE BILL(
BILL_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
BUYER_ID BIGINT NOT NULL,
SALEORDER_ID BIGINT NOT NULL,
);
ALTER TABLE SALEORDER ADD CONSTRAINT FK_SO_BUYER FOREIGN KEY(BUYER_ID) REFERENCES BUYER(BUYER_ID);
ALTER TABLE BILL ADD CONSTRAINT FK_BILL_BUYER FOREIGN KEY(BUYER_ID) REFERENCES BUYER(BUYER_ID);
ALTER TABLE BILL ADD CONSTRAINT FK_BILL_SO FOREIGN KEY(SALEORDER_ID) REFERENCES SALEORDER(SALEORDER_ID);
詳細な回答をいただきありがとうございます。私たちは、Bill_IDをSaleOrderテーブルまたはクラスに入れないようにしていますが、これはすべてこの問題の原因です。 – jimgardener
今、私は理解しています。それでは "コード化"する必要があります。XMLで "構成"することはできません。カスケード削除は上記のように動作します。あなたが求めているのは、JPAやHibernateの一部ではない、「相手の削除」や「参照の削除」と呼ばれることがあります。ここ はHQLを使用して、コードスニペットである: セッションセッション=(セッション)entityManager.getDelegate(); // SaleOrderを参照してBillエントリを削除します。 クエリクエリ= session.createQuery( "billを削除するsaleOrder_id =:saleOrder_id"); query.setParameter( "saleOrder_id"、saleOrder_id).executeUpdate(); –