gpt4 book ai didi

java - JPA,删除由不同经理找到的实体

转载 作者:行者123 更新时间:2023-12-01 13:45:54 26 4
gpt4 key购买 nike

假设我们有一个简单的实体 bean,如上所示

@Entity
public class Schemes implements serializable{
...
@Id private long id;
...
}

我使用 find 方法找到一条记录,它工作得很好,问题是我稍后无法通过另一个 EntityManager 操作它(删除),例如我找到它一个方法,后来我想把它去掉,这是什么问题?!如果我再次在同一个经理处找到它,我会删除它,但如果另一个经理找到了该对象,我就不能。

@ManagedBean @SessionScopped class JSFBean {
private Schemes s;
public JSFBean(){
....
EntityManager em;//.....
s=em.find(Schemes.class,0x10L);//okay!
....
}

public void remove(){//later
....
EntityManager em;//.....
em.getTransaction().begin();
em.remove(s);//Error! some weird error, it throws IllegalArgumentException!
em.getTransaction().commit();
....
}
}

非常感谢。

最佳答案

您可能会收到java.lang.IllegalArgumentException:正在删除分离的实例

两个 EM 不共享持久性上下文,对于第二个 EM,您的对象被视为分离的。尝试删除分离的对象将导致 IllegalArgumentException

您可以在删除之前重新获取实体:

Schemes originalS = em.find(Schemes.class, s.getId());
em.remove(originalS);

编辑您还可以使用参数化批量查询删除实体,而无需先获取实体:

DELETE FROM Schemes s WHERE s.id = :id

请注意,批量查询本身可能会导致问题。首先,它们绕过持久性上下文,这意味着无论您对批量查询执行什么操作,都不会被持久性上下文中的对象反射(reflect)。对于删除查询来说,这个问题比对于更新查询来说问题要小。其次,如果您在实体上定义了任何级联规则 - 它们将被批量查询忽略。

关于java - JPA,删除由不同经理找到的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20379587/

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