2012-05-26 85 views
1

我在Java中這樣的代碼(休眠3.1):兒童entitied通過本地SQL刪除仍然存在的EntityManager

EntityManager manager = ...; 
Entity parent = manager.find(...); 
removeChildrenSQL(parent, manager); // here DELETE FROM ... is executed 
manager.flush(); 

我需要移除的實體不能從冬眠看到了。

我試圖(和這些沒有工作):

1)manager.refresh(父);

2)手動刷新除去實體

3)重新加載的父與所有的孩子。

我該怎麼辦?

+0

請將removeChildrenSQL! – tibtof

回答

0

嘗試

manager.detach(parent); 
parent = manager.find(Entity.class, parent.getId()); 

(您可能還需要分離的兒童,特別是如果你刪除它們之前修改它們)對所有兒童,其中會話是你的Hibernate的Session

+0

javax.persistence.EntityManager沒有detach()方法,那麼你引用了什麼方法? – Oleg

+0

http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#detach%28java.lang.Object%29 –

0

呼叫session.evict(childEntity)

爲了讓Hibernate的Session使用:

org.hibernate.Session session = (org.hibernate.Session)manager.getDelegate(); 

或者,如果你在一個會話bean是你能得到它使用@PersistenceContext註解注入。

更新:也許你的問題與hibernate的緩存有關。嘗試設置

<shared-cache-mode>NONE</shared-cache-mode> 

在您的prersistence.xml。 之後,一個manager.refresh(父)應該做的伎倆。

UPDATE2: 或者,也許孩子們在一個慵懶的集合,在這種情況下,有兩種解決方法: 註釋的孩子:

@OneToMany(cascade=CascadeType.REFRESH,fetch=FetchType.LAZY) 

在這種情況下,你仍然需要做manager.refresh(親本); 或使用:

Hibernate.initialize(parent.getChidren()); 
+0

@Oleg檢查更新,請 – tibtof

+0

我打電話給evict()孩子 - 它沒有工作 – Oleg

+0

@Oleg你如何刪除實體?你是否嘗試從列表中刪除它們?如果您仍然需要幫助,請發佈更多代碼。 – tibtof