2011-08-02 12 views
0

が必要削除エンティティは、私がhibernate.Theエンティティに3つのエンティティ間のカスケード関係をマップしようとしています

1.Item --has a Maker and a Distributor. 
2.Maker --has a set of items created by him. 
3.Distributor ---has a set of items he distributes. 

関係している休止状態にObjectDeletedExceptionが発生します、

1.When an Item is saved/updated ,its Maker and Distributor should be saved/updated 
2.When a Maker is deleted ,all his items should be deleted. 
3.When a Distributor is deleted,all his items should be deleted. 
私はこのようにしようとした

class Item{ 
    private Long item_id; 
    ... 
    private Maker maker; 
    private Distributor distributor; 
    ... 
} 
Item.hbm.xml 
... 
    <!-- 
    when Item is saved the associated Distributor is also saved 
    --> 
    <many-to-one name="distributor" class="Distributor" column="DISTRIBUTOR_ID" lazy="false" cascade="save-update"/> 
    <!-- 
    when Item is saved the associated Maker is also saved 
    --> 
    <many-to-one name="maker" class="Maker" column="MAKER_ID" lazy="false" cascade="save-update"/> 
... 

class Maker{ 
    private Long maker_id; 
    ... 
    Set<Item> items; 
    public Maker(){ 
     items = new HashSet<Item>(); 
    } 
... 
} 
Maker.hbm.xml 
... 
<!-- 
when a Maker is saved,all his items are saved. 
when a Maker is deleted,all his items are deleted. 
--> 
<set name="items" inverse="true" table="ITEM" lazy="false" cascade="all,delete-orphan"> 
      <key column="MAKER_ID" /> 
      <one-to-many class="Item" /> 
</set> 
... 


class Distributor{ 
    private Long distributor_id; 
    ... 
    Set<Item> items; 
    public Distributor(){ 
     items = new HashSet<Item>(); 
    } 
    ... 
} 

Distributor.hbm.xml 
<!--when a Distributor is saved, all his items are saved. 
    when a Distributor is deleted, all his items are deleted 
--> 
<set name="items" inverse="true" table="ITEM" lazy="false" cascade="all,delete-orphan"> 
<key column="DISTRIBUTOR_ID" /> 
<one-to-many class="Item" /> 
</set> 
... 

次に、いくつかのインスタンスを作成し、Makerを削除するとすべてのインスタンスが削除されたかどうかを確認しようとしました私はこれをしようとすると、アイテム.. はしかし、私はセットアイテムはメーカーとDistributor.Iこれが正しくマップ/モデル化する方法がわからないの両方に属しているので、それがある、と思う

hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [myapp.domain.Item#27] 

このエラーが発生します。 誰かが私を助けることができますか?私は実際に休止状態で私の最初のレッスンを受けています。

誠実に

ジム。

main(..){ 
    createEntities(); 
    deleteSomeEntities(); 
} 

public void createEntities(){ 
    session = HibernateUtil.getCurrentSession(); 
    Transaction tx = null; 

    Maker maker1 = new Maker(); 
    maker1.setName("maker1"); 

    Distributor dis1 = new Distributor(); 
    dis1.setName("dis1"); 

    Item item1 = new Item(); 
    item1.setName("item1"); 
    item1.setMaker(maker1); 
    item1.setDistributor(dis1); 

    Item item2 = new Item(); 
    item2.setName("item2"); 
    item2.setMaker(maker1); 
    item2.setDistributor(dis1); 

    Set<Item> items = new HashSet<Item>(); 
    items.add(item1); 
    items.add(item2); 
    maker1.setItems(items); 
    dis1.setItems(items); 
    try{ 
     itemdao.saveOrUpdate(item1); 
     itemdao.saveOrUpdate(item2); 

    }catch(RuntimeException e){ 
     logger.error("rolling back"+e.getMessage()); 
     tx.rollback(); 
     throw e; 
    } 
} 

public void deleteSomeEntities(){ 
    session = HibernateUtil.getCurrentSession(); 
    Transaction tx = null; 
    try{ 
     Maker maker = makerdao.findMakerByName("maker1"); 
     String name = maker.getName(); 
     logger.info("got maker:"+name); 
     makerdao.deleteMaker(maker); 
     tx.commit(); 
    }catch(RuntimeException e){ 
     logger.info("rolling back"); 
     tx.rollback(); 
     throw e; 
    } 
} 

答えて

1

このエラーが発生した時はいつでもあなたがオブジェクトを削除しようとしているが、そのオブジェクトは、いくつかの親に参照されているため、そのリストオブジェクト、およびお使いの推移永続性(すなわちカスケード)の設定は、このような親のことを設定されています関係を制御します。つまり、オブジェクトを削除するように指示しているが、オブジェクトが指定されたコレクション内にある場合は、保存を実行するように指示しています。

削除しようとしているオブジェクトを親のコレクションから削除するか、カスケード/逆マッピングを変更するだけです。

+0

これは、メーカーとディストリビュータの2人の親からアイテムをクリアする必要があることを意味します.thanks – jimgardener

+0

@jimgardener、yep。または、カスケード設定を変更します。 – hvgotcodes

0

あなたのマッピングにカスケードがあると思います。

カスケード=「セーブ・アップデート」を

「すべて」=カスケードを試してみて、その後、Hibernateがあなたのためにそれを行う必要があります。

関連する問題