0

我正在为大学写一个项目,我遇到了一些奇怪的现象。该程序应该为餐厅服务,因此它有一个服务器端来管理不同前端的所有需求。不同的前端是“晚餐终端”、“厨房终端”、“服务员终端”和“管理终端”。

当我将一个对象添加到数据库时,我在数据库中看到它,厨房终端接收到它,我看到它得到的对象是正确的。

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 尝试在之后检索它的事实有关。

会话不同并且源自不同的连接,并且特定顺序存在于数据库中,因此我认为没有理由不返回该值。我认为这与模型的缓存有关,但是我在休眠中是个菜鸟,所以我无法指出问题所在。

4

1 回答 1

0

sessionOrder.getOrderId() 返回数据库中对应对象所需的 ID(它存在)数据库上的查询返回 null 到 ord。

ord 对象为空,因此它会引发 NPE。我猜hibernate找不到给定ID的订单。

在此处添加一些日志记录,您会看到是什么导致了您的麻烦

于 2013-06-01T22:35:47.317 回答