繁体   English   中英

JTA 5中的JTA并持续比赛

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM