我正在为大学写一个项目,我遇到了一些奇怪的现象。该程序应该为餐厅服务,因此它有一个服务器端来管理不同前端的所有需求。不同的前端是“晚餐终端”、“厨房终端”、“服务员终端”和“管理终端”。
当我将一个对象添加到数据库时,我在数据库中看到它,厨房终端接收到它,我看到它得到的对象是正确的。
public void addSessionOrder(String id, SessionOrder sessionOrder)
{
Session context = clientSessions.get(id);
context.beginTransaction();
context.save(sessionOrder);
context.getTransaction()
.commit();
}
请注意,每个终端(连接)在休眠状态下都有自己的会话。
但是,一旦我尝试更新 sessionorder 的状态,我就会得到这个异常
java.lang.NullPointerException
at database.DatabaseContext.updateSessionOrderStatus(DatabaseContext.java:170)
at protocol.handlers.UpdateSessionOrderStatusHandler.handle(UpdateSessionOrderStatusHandler.java:35)
at server.ResturantServer.handleClientMessage(ResturantServer.java:126)
at server.ConnectionManager.handleClientMessage(ConnectionManager.java:86)
at server.SockJSSocketHandler$3.handle(SockJSSocketHandler.java:55)
这是方法:
public void updateSessionOrderStatus(String id, SessionOrder order, OrderStatus newStatus)
{
Session context = clientSessions.get(id);
context.beginTransaction();
SessionOrder ord = (SessionOrder)context.get(SessionOrder.class, order.getOrderId());
ord.setStatus(newStatus);
context.update(ord);
context.getTransaction()
.commit();
}
引发异常的行是“ord.setStatus(newStatus);” 调试后这是我拥有的信息:字段 id 和 sessionOrder 包含合法数据并根据需要启动。sessionOrder.getOrderId() 返回数据库中相应对象所需的 ID(它存在)数据库上的查询返回 null 到 ord。
我注意到的另一件事是,如果我关闭服务器(杀死休眠)并重新启动所有内容,那么整个事情都会正常工作。所以我认为这与某些会话 X 将对象插入数据库,而其他会话 Y 尝试在之后检索它的事实有关。
会话不同并且源自不同的连接,并且特定顺序存在于数据库中,因此我认为没有理由不返回该值。我认为这与模型的缓存有关,但是我在休眠中是个菜鸟,所以我无法指出问题所在。