我想知道删除方法的哪个实现更好:
public void remove(T t) {
entityManager.remove(entityManager.merge(t));
}
public void remove(PK pk) {
entityManager.remove(entityManager.getReference(entityType, pk));
}
我已经阅读了很多关于此的文章,并且几乎每一篇文章都与第一种方法类似,在我看来这是非常不必要的,因为它可以在不需要从数据库中检索整个实体的情况下完成(如果它不存在于持久化上下文中)然后将其删除。有什么我想念的东西,第一种方法真的更好吗?
答案 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));