我正在尝试实施保存更改/取消更改屏幕。
我有一个主要的休眠会话。当有人想编辑对象时,我创建一个临时会话并从主会话合并该对象。
// To edit Object x with id id_x
Object a = mainSession.get(id_x);
Object b = tempSession.merge(a);
// Change object b with tempSession
// If save: mainSession.merge(b) and discard tempSession.
// If cancel: discard b and tempSession.
...
...
// If saveAll: mainSession.flush();
// If cancellAll: mainSession.rollback(), reload all objects.
这适用于数据库中已有的项目。但是当我想用新创建的对象应用相同的逻辑时,tempSession.merge(a)会失败。
Object d = new Object();
mainSession.save(d);
// To edit Object d with id id_d
Object a = mainSession.get(id_d);
Object b = tempSession.merge(a); // The application gets blocked/locked here.
我认为tempSession.merge尝试从数据库加载对象,因为tempSession没有id_d的对象,但由于该对象在数据库中不存在或者表/行被锁定,因此失败。有没有办法创建对象d的副本并将其附加到tempSession然后重新附加到mainSession?或者你能建议其他方法来实现这个吗?
答案 0 :(得分:0)
你真的需要两个会话这个复杂的设置吗?通常,由于可能存在死锁,因此不应在同一线程中同时使用多个会话。
有许多方法可以在不使用多个会话的情况下实现所需的行为。例如,您可以从会话中detach()
加载对象,然后将其合并到同一会话中。或者,您可以保持附加对象,并在要放弃更改时调用refresh()
。