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,但我真的很想明白为什么会发生这种情况。
这是我(JPA)单元测试做什么,而我想这会的工作,我不知道这是最好的工作方式是什么?我的希望是将容器交给容器,使它在缓存和提交数据方面变得更有效率。 –
(并且,即使它工作,我主要关心的是理解为什么.remove()不起作用) –