2011-07-22 14 views
0

バイヤー用のBill for SaleOrderを作成するWebアプリケーションで、データベーステーブルを作成してマッピングを休止しようとしました。エンティティ間の関係は以下のとおりです。休止状態でのカスケード削除と1対1のマッピング

  1. Aビルは、買い手とSaleOrder

  2. A SaleOrderはバイヤーを持っていました。

  3. 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); 

答えて

1

は私が注釈を使用してのご質問にお答えしましょう、XML構成が少し古風なように思われます私。ソリューションは、Billに参照を保持しないことです。しかし、SaleOrderは、BillとBuyerへの1-1参照を、SaleOrderへの1-n参照として、関係定義の上のCascadeType.DELETE_ORPHANを使用して保持します。したがって、SaleOrderが削除されると、基礎となるBillが削除され、購入者が削除されると、基礎となるSaleOrderおよびBillの基礎となるものが削除されます。

class Bill{ 
    private Long billId;  
    ...  
} 

class SaleOrder{  
    private Long saleOrderId;  
    ...  
    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
    @Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) 
    private Bill bill; 
    ... 
} 

class Buyer { 
    private Long buyerId; 
    private String name; 
    ...  
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
    @Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) 
    private List<SaleOrder> saleOrders; 
    ... 
} 

あなたはSaleOrderと法案のためSaleOrderのためのバイヤーを得るためにあなたののDAOをコーディングする必要があります。これはもちろん、別の質問です、これを行う方法。しかし、あなたは良い本とWebリソースを見つける必要があります。

+0

詳細な回答をいただきありがとうございます。私たちは、Bill_IDをSaleOrderテーブルまたはクラスに入れないようにしていますが、これはすべてこの問題の原因です。 – jimgardener

+1

今、私は理解しています。それでは "コード化"する必要があります。XMLで "構成"することはできません。カスケード削除は上記のように動作します。あなたが求めているのは、JPAやHibernateの一部ではない、「相手の削除」や「参照の削除」と呼ばれることがあります。ここ はHQLを使用して、コードスニペットである: セッションセッション=(セッション)entityManager.getDelegate(); // SaleOrderを参照してBillエントリを削除します。 クエリクエリ= session.createQuery( "billを削除するsaleOrder_id =:saleOrder_id"); query.setParameter( "saleOrder_id"、saleOrder_id).executeUpdate(); –

関連する問題