[英]JTA in jboss 5 and persist race
我在jboss 5.1.0.GA中遇到了一个奇怪的JTA casen。 我有一个带有两个方法removeEntity()
和findEntityByField()
的服务类-名称反映了操作。
当我调用removeEntity()
并随后立即运行带有与已删除实体匹配的字段参数的findEntityByField()
,仍在db中找到它。 这仅在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()
:
@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();
}
findEntityByField()
:
@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"
事务是手动/明确提交的。
我可以接受使用命名查询来删除实体的方法,但是我真的很想了解为什么会这样。
尝试
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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.