我想知道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)
我已经阅读了很多关于这方面的文章,几乎每一篇文章都与第一种方法类似,在我看来这是非常不必要的,因为它可以在不需要从数据库中检索整个实体的情况下完成(如果是不存在于持久化上下文中)然后将其删除.有什么我想念的东西,第一种方法真的更好吗?
您可以通过调用来检查该实体是否受到管理
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)
| 归档时间: |
|
| 查看次数: |
2384 次 |
| 最近记录: |