PersistentObjectException:传递给persist的分离实体
在我的应用程序中,我连接到一个websocket。 套接字发送JSON数据。当它变得可用时,我在不同的工作中处理它。在每项工作中,我都将JSON转换为带有GSON的模型对象。有3种类型的模型,都是独立的,并且在MappedSuper类中有一个共同的时间戳字段。他们没有一个明确的字段。我在模型上调用保存,并在1000次中的1次中抛出“PersistentObjectException:传递给持久化的分离实体”。PersistentObjectException:传递给persist的分离实体
从启动作业连接到WebSocket调用多个作业。我正在使用的库为每个传入消息创建一个不同的线程。然后在保存到数据库之前将线程转换为作业。我这样做,因为否则另一个PersistentObjectException抛出有关将ID从1更改为2或类似的东西,如果我允许原始线程调用保存。
我还有另一个同时访问数据库的作业。什么可能是错的?
@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;
}
编辑:添加了一些代码示例
回答:
我发现此解决方法现在可以工作。也许这与Gson和Jpa如何互动有关。不确定...
public void processMessage(String message) { Appointment appointment = new Gson().fromJson(message, Appointment.class);
//recreate appointment
appointment = new Appointment(appointment);
appointment.save(); }
回答:
基本上这意味着EntityManager
不会跟踪他们的任何更多:This is a good overview。 如果你没有明确地要求它是奇怪的,它们会被认为是分离的。但解决方法可能是在您的DAO方法和merge
这些奇怪的情况下使用“防御”的方法;即:
public void save (Model possiblyDetachedModel) { if (entityManager.contains(possiblyDetachedModel)) {
entityManager.merge(possiblyDetachedModel);
} else {
entityManager.persist(possiblyDetachedModel);
}
}
我并不特别喜欢它,因为它不应该需要,当你persist
荷兰国际集团全新的对象来完成。这可能是值得一些登录(或尽可能调试)“merge
”分支,并真正检查那些流氓物体 - 我敢肯定EntityManager
只能使用@Id
字段作为检测机制...
以上是 PersistentObjectException:传递给persist的分离实体 的全部内容, 来源链接: utcz.com/qa/262629.html