2014-03-28 20 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()不起作用) –