我正在为大学写一个项目,我遇到了一些奇怪的现象。 该程序应该为餐厅服务,因此它有一个服务器端,可以管理不同前端的所有需求。不同的前端是“晚餐终端”,“厨房终端”,“服务员终端”和“管理终端”。
当我向DB添加一个对象时,我在DB中看到它并且厨房终端收到它,我看到它得到的对象是正确的。
public void addSessionOrder(String id, SessionOrder sessionOrder)
{
Session context = clientSessions.get(id);
context.beginTransaction();
context.save(sessionOrder);
context.getTransaction()
.commit();
}
注意每个终端(连接)在休眠时都有自己的会话。
但是,一旦我尝试更新会话订单的状态,我就会收到此异常
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);” 调试后,这是我的信息: fields id和sessionOrder包含合法数据,并根据需要启动。 sessionOrder.getOrderId()返回DB中相应对象所需的ID(它存在) DB上的查询返回null到ord。
我注意到的另一件事是,如果我关闭服务器(杀死hibernate)并重启所有内容,整个过程都可以正常工作。所以我认为它与某些会话X将对象插入数据库的事实有关,而其他一些会话Y则试图在之后检索它。
会话是不同的,并且源自不同的连接,并且特定的顺序存在于DB中,因此我认为没有理由不返回该值。 我认为它与模型的缓存有关,但是我在休眠方面相当不错,所以我不能指出这个问题。
答案 0 :(得分:0)
sessionOrder.getOrderId()返回DB中相应对象所需的ID(它存在),DB上的查询返回null为ord。
ord对象为null,因此它会抛出一个NPE。我猜hibernate无法找到具有给定ID的订单。
在此处添加一些日志记录,您将看到导致您出现问题的原因