首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >em.remove(st)和em.remove(em.contains(st) )有什么区别?st :em.merge(St);

em.remove(st)和em.remove(em.contains(st) )有什么区别?st :em.merge(St);
EN

Stack Overflow用户
提问于 2018-03-15 11:36:55
回答 1查看 301关注 0票数 2

我得到了一个错误:

代码语言:javascript
复制
java.lang.IllegalArgumentException: Removing a detached instance model.student

然后,我在堆栈溢出中搜索它,并找到了以下解决方案:

而不是:

代码语言:javascript
复制
em.remove(student); 

我现在用:

代码语言:javascript
复制
em.remove(em.contains(student) ? student : em.merge(student));

但我真的不明白为什么它现在起作用了。

有人能告诉我这种方法的区别吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-15 11:45:40

@为什么它现在起作用了,EntityManager只对ManagedEntities起作用。当您试图移除已经分离的实体时,您将得到一个异常。

因此,要进行安全删除,您必须首先检查实体是否处于托管状态。这是通过em.contains方法实现的。

如果该实体尚未处于托管状态,则需要手动将其移动到托管状态。这可以通过使用,合并来实现。

Merge基本上将该实体移动到托管状态。

编辑

我可以从您的代码中看到,您已经使用em.find检索了实体,这将为您提供一个托管实体。但是,您没有将该值存储到任何东西,而是使用方法的输入参数,它不是由em管理的。尝试以下代码,

代码语言:javascript
复制
`public void deleteStudentsPersistence(Student student) {
    Student managedEntity = em.find(Student.class, student.getId());
    em.remove(managedEntity);
   // em.remove(em.contains(student) ? student : 
   // em.merge(student));
}`
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49298433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档