2011-03-14 76 views
5

我目前的項目使用HSQLDB2.0和JPA2.0。EntityManager在查詢後不刷新數據

這種情況是:我查詢數據庫以獲得contactDetails的列表person。我在用戶界面刪除單個contactInfo,但不保存該數據(取消保存部分)。

我再次執行相同的查詢,現在結果列表比先前的結果小1因爲我在UI上刪除了一個contactInfo。但是,如果我進行覈對,那麼contactInfo仍然可以在數據庫中使用。

但是,如果我在查詢開始之前包含entityManager.clear(),則每次都會得到正確的結果。

我不理解這種行爲。任何人都可以爲我清楚嗎?

回答

15

而不是再次查詢,試試這個:

entityManager.refresh(person); 

一個更完整的例子:

EntityManagerFactory factory = Persistence.createEntityManagerFactory("..."); 
EntityManager em = factory.createEntityManager(); 
em.getTransaction().begin(); 

Person p = (Person) em.find(Person.class, 1); 
assertEquals(10, p.getContactDetails().size()); // let's pretend p has 10 contact details 
p.getContactDetails().remove(0); 
assertEquals(9, p.getContactDetails().size()); 

Person p2 = (Person) em.find(Person.class, 1); 
assertTrue(p == p2); // We're in the same persistence context so p == p2 
assertEquals(9, p.getContactDetails().size()); 

// In order to reload the actual patients from the database, refresh the entity 
em.refresh(p); 
assertTrue(p == p2); 
assertEquals(10, p.getContactDetails().size()); 
assertEquals(10, p2.getContactDetails().size()); 

em.getTransaction().commit(); 
em.close(); 
factory.close(); 
+1

這就是我的生活! – riship89 2014-03-25 20:30:56

2

clear()的行爲是在其javadoc:

清除持久化上下文的解釋,導致所有管理的實體,成爲超脫。 對尚未刷新到數據庫的實體所做的更改不會被保留。

也就是說,刪除contactInfo不會持久。

ContactInfo是沒有得到從數據庫中刪除,因爲您刪除ContactDetailsContactInfo之間的關係,但不是ContactInfo本身。如果你想刪除它,你需要明確使用remove()或指定orphanRemoval = true關係。

+0

看起來他並不想因爲他已經取消了實際刪除它移走,但他想知道爲什麼他下一次查詢數據庫時,該項目沒有放回收藏中。 – Behrang 2011-03-14 11:00:17