JPA和DAO执行删除操作

时间:2011-11-12 18:56:38

标签: java jpa dao

我想知道删除方法的哪个实现更好:

public void remove(T t) {
   entityManager.remove(entityManager.merge(t));
}

public void remove(PK pk) {
   entityManager.remove(entityManager.getReference(entityType, pk));
}

我已经阅读了很多关于此的文章,并且几乎每一篇文章都与第一种方法类似,在我看来这是非常不必要的,因为它可以在不需要从数据库中检索整个实体的情况下完成(如果它不存在于持久化上下文中)然后将其删除。有什么我想念的东西,第一种方法真的更好吗?

1 个答案:

答案 0 :(得分:1)

您可以通过调用

来检查实体是否受管理
boolean isManaged = entityManager.contains( t );

如果是真的,只需致电

entityManager.remove(t);

否则你的第二种方法似乎更好,因为合并可能会因为急切加载(如果配置)而导致更多的数据库活动。 getReference上的javadoc说“获取一个实例,其状态可能会被延迟取出。如果数据库中不存在请求的实例,则在首次访问实例状态时抛出EntityNotFoundException。(持久性提供程序运行时允许调用getReference(java.lang.Class,java.lang.Object)时抛出EntityNotFoundException。)除非在实体管理器打开时应用程序访问实例状态,否则应用程序不应期望实例状态在分离时可用。 “

总之,实体必须进行管理,我建议:

em.remove(em.contains(r) ? r : em.merge(r));