JPA和DAO执行删除操作

Vac*_*dik 5 java dao jpa

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

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

public void remove(PK pk) {
   entityManager.remove(entityManager.getReference(entityType, pk));
}
Run Code Online (Sandbox Code Playgroud)

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

sta*_*ker 1

您可以通过调用来检查该实体是否受到管理

boolean isManaged = entityManager.contains( t );
Run Code Online (Sandbox Code Playgroud)

如果为真,只需调用

entityManager.remove(t);
Run Code Online (Sandbox Code Playgroud)

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

简而言之,必须对实体进行管理,我建议:

em.remove(em.contains(r) ? r : em.merge(r));
Run Code Online (Sandbox Code Playgroud)