【发布时间】:2011-10-05 23:10:12
【问题描述】:
在我的应用程序中,我已连接到 websocket。 套接字正在发送 JSON 数据。随着它变得可用,我在另一个工作中处理它。在每个作业中,我都使用 GSON 将 JSON 转换为模型对象。有 3 种类型的模型,它们都是独立的,并且在 MappedSuperclass 中具有一个公共时间戳字段。他们没有 id 显式字段。我在模型上调用 save ,并且在 1000 次中有 1 次抛出“PersistentObjectException:传递给持久化的分离实体”。
从连接到 websocket 的启动 Job 调用多个作业。我正在使用的库为每条传入消息创建一个不同的线程。然后我将线程转换为作业,然后保存到数据库。我这样做是因为如果我允许原始线程调用保存,则会引发另一个关于将 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;
}
编辑:添加了一些代码示例
【问题讨论】:
-
如何识别模型对象? @Id 字段中的值是否可能是非唯一的?
-
每个模型类都有一个 id 字段,即为空。我的课程扩展了模型。他们本身并没有声明一个 id 字段。
-
顺便说一句,我不太明白这条消息的含义。 “分离的实体传递给坚持”在英语中是什么意思? (我不是母语人士)
标签: java hibernate jpa playframework