2014-03-28 39 views
0

我在jboss 5.1.0.GA中遇到了一個奇怪的JTA情況。我有一個服務類,有兩種方法removeEntity()findEntityByField() - 名稱反映的行動。JTA在jboss 5和持續競賽中

當我打電話removeEntity(),然後立即運行findEntityByField()與字段參數匹配刪除的實體 - 它仍然在數據庫中找到。這隻發生在removeEntity()使用EntityManager.remove(),如果我使用刪除(命名)查詢,而不是按預期工作(?!)。

看着數據庫,它被刪除,無論我使用了哪個實現。的 「有問題」 removeEntity()

實現:

public void removeEntity(long id) { 
    EntityManager entityManager = entityManagerFactory.createEntityManager(); 
    MyEntity myEntity = entityManager.find(MyEntity.class, id); 
    entityManager.remove(myEntity); 
    entityManager.close(); 
} 

工作removeEntity()的執行情況:

實施 findEntityByField()
@NamedQuery(name = "deleteById", query = "delete MyEntity where id = :id") 

public void removeEntity(long id) { 
    EntityManager entityManager = entityManagerFactory.createEntityManager(); 
    Query query = entityManager.createNamedQuery("deleteById"); 
    query.setParameter("id", id); 
    query.executeUpdate(); 
    entityManager.close(); 
} 

@NamedQuery(name = "findByField", query = "from MyEntity where field = :field"), 

public MyEntity findEntityByField(String field) { 
    EntityManager entityManager = entityManagerFactory.createEntityManager(); 
    Query query = entityManager.createNamedQuery("findByField"); 
    query.setParameter("field", field); 
    MyEntity myEntity = query.getSingleResult(); 
    entityManager.close(); 
    return myEntity; 
} 

可以值得一提的是我有一個這個場景的單元測試不會失敗。但這與JTA案例不同,因爲它是transaction-type="RESOURCE_LOCAL"交易是手動/明確提交的。

我可以接受使用命名查詢刪除entites,但我真的很想明白爲什麼會發生這種情況。

回答

0

嘗試

public void removeEntity(long id) { 
    EntityManager entityManager = entityManagerFactory.createEntityManager(); 
    entityManager.getTransaction().begin(); 
    MyEntity myEntity = entityManager.find(MyEntity.class, id); 
    entityManager.remove(myEntity); 
    entityManager.getTransaction().commit(); 
    entityManager.close(); 
} 
+0

這是我(JPA)單元測試做什麼,而我想這會的工作,我不知道這是最好的工作方式是什麼?我的希望是將容器交給容器,使它在緩存和提交數據方面變得更有效率。 –

+0

(並且,即使它工作,我主要關心的是理解爲什麼.remove()不起作用) –