gpt4 book ai didi

java - 持久对象异常 : detached entity passed to persist

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:25 24 4
gpt4 key购买 nike

在我的应用程序中,我连接到一个 websocket。套接字正在发送 JSON 数据。随着它变得可用,我在不同的工作中处理它。在每项工作中,我都会使用 GSON 将 JSON 转换为模型对象。有 3 种类型的模型,它们都是独立的,并且在 MappedSuperclass 中有一个共同的时间戳字段。他们没有 id 显式字段。我在模型上调用保存,并且在 1000 次中有 1 次抛出“PersistentObjectException:分离的实体传递给持久化”。

多个作业从连接到 websocket 的启 Action 业中调用。我正在使用的库为每条传入消息创建不同的线程。然后我将线程转换为作业,然后再保存到数据库。我这样做是因为如果我允许原始线程调用保存,否则会抛出另一个关于将 id 从 1 更改为 2 或类似内容的 PersistentObjectException。

我还有另一个正在运行的作业同时访问数据库。有什么问题吗?

@Override
public void onMessage(final WebSocketMessage message){
new Job() {
@Override
public void doJob() {
processMessage(message.getText());
}
}.now();

}

public void processMessage(String message) {
Appointment appointment = new Gson().fromJson(message, Appointment.class);
appointment.save();
}

@Entity
public class Appointment extends CalendarEvent {
private String owner;
}

@MappedSuperclass
public abstract class CalendarEvent extends Model {
private long timestamp;
}

编辑:添加了一些代码示例

最佳答案

基本上这意味着 EntityManager 将不再跟踪它们:This is a good overview . 如何当您没有明确要求时,他们会被认为是超然的,这很奇怪。但解决方法可能是在您的 DAO 方法中使用“防御”方法并合并这些奇怪的情况;即:

public void save (Model possiblyDetachedModel) {

if (entityManager.contains(possiblyDetachedModel)) {
entityManager.merge(possiblyDetachedModel);
} else {
entityManager.persist(possiblyDetachedModel);
}
}

我不是特别喜欢它,因为当您持久化全新的对象时不需要这样做。可能值得在“merge”分支中进行一些登录(或调试,如果可能的话)并真正检查那些流氓对象 - 我很确定 EntityManager 可以仅使用 @Id 字段作为检测机制...

关于java - 持久对象异常 : detached entity passed to persist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7668804/

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