用于选择不存在的实体的默认JPA行为

时间:2013-09-30 14:38:39

标签: jpa

我正在编写一些测试以确保所有CRUD方法都正常工作。他们每个人都工作正常,但测试删除方法似乎有点棘手。

在我的测试中,我这样做:

// remove
a = dao.select(1); // previously inserted in the DB
dao.remove(a);
assertNull(dao.select(a.getId()));

DAO类(仅选择和删除):

@Override
 public AtividadeComercial select(int id) {
      return em.getReference(AtividadeComercial.class, id);
}

@Override
public void remove(AtividadeComercial e) {
    EntityTransaction t = em.getTransaction();
    boolean active = t.isActive();
    if(!active)
        t.begin();
    em.remove(em.getReference(e.getClass(), e.getId()));
    if(!active)
        t.commit();
}

但是测试总是在javax.persistence.EntityNotFoundException之后抛出remove。这是正常行为还是真的错了?对不起,如果这看起来很明显,但我找不到答案。

1 个答案:

答案 0 :(得分:0)

getReference()永远不会返回null。阅读其文档:

  

获取一个实例,其状态可能会被懒散地取出。如果数据库中不存在请求的实例,则在首次访问实例状态时抛出EntityNotFoundException。

此方法返回应该存在的实体的代理。它甚至没有进行数据库查询来检查实体是否存在:它假定它存在。如果稍后初始化代理,并且实体不存在,那么您将获得EntityNotFoundException。