gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:20:47 26 4
gpt4 key购买 nike

我遇到了这个错误:

java.lang.IllegalArgumentException: Removing a detached instance model.student

然后我在stackoverflow中搜索,找到了这个解决方案:

代替:

em.remove(student); 

我现在正在使用:

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

但我真的不明白为什么它现在可以工作了。

有人能告诉我这些方法之间的区别吗?

最佳答案

@为什么它现在可以工作了,EntityManager 仅适用于 ManagedEntities。当你试图删除一个已经分离的实体时,你会得到一个异常。

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

如果该实体尚未处于托管状态,我们需要手动将其移至托管状态。这可以通过使用 merge 来实现.

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

[编辑]

我可以在您的代码中看到您使用 em.find 检索了实体,这将为您提供一个托管实体。但是您没有将该值存储到任何内容,并使用了不受 em 管理的方法的输入参数。试试下面的代码,

`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));
}`

关于java - em.remove(st) 和 em.remove(em.contains(st) ? st : em. merge(st)); 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49298433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com