2011-08-02 104 views
0

我試圖在hibernate.The實體3個實體之間的級聯關係映射是刪除實體導致ObjectDeletedException休眠

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. 

關係需要:

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> 
... 

然後我創建了一些實例,並試圖找出是否刪除一個製造商刪除所有他項目.. 然而,當我試試這個,我得到這個錯誤

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

我認爲,這是因爲設置項屬於兩個Maker和Distributor.I我不知道如何來模擬/正確映射此。 有人可以幫助我嗎?我真的帶着我的第一個課程與休眠。

sincerely

Jim。

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

每當你得到這個錯誤,它因爲你試圖刪除的對象,但該對象被引用在一些父對象列表,你傳遞的持久性(即級聯)設置設置使得母控制關係。換句話說,你正在給hibernate衝突的命令:你告訴它刪除該對象,但是你也告訴它,如果該對象在指定的集合中,則進行保存。

只需刪除要從父級集合中刪除的對象,或者更改級聯/反向映射。

+0

這意味着我將不得不從兩個父母,製造商和分銷商..清除項目嘗試..謝謝 – jimgardener

+0

@jimgardener,是的。或者改變你的級聯設置。 – hvgotcodes

0

我想你會發現它是你的映射級聯。

級聯=「保存更新」

嘗試級聯=「所有」,然後休眠應該爲你做它。