我正在为大学写一个项目,并且遇到了一些奇怪的现象。 程序应该服务于一家餐厅,因此它有一个服务器端,管理不同前端的所有需求。不同的前端是“晚餐终端”,“厨房终端”,“服务员终端”和“管理终端”。休眠无法从数据库检索对象
当我添加一个对象到数据库时,我在数据库中看到它,厨房终端收到它,我发现它得到的对象是正确的。
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()返回DB中对应对象的所需ID(存在) DB上的查询返回null给ord。
我注意到的另一件事,如果我关闭服务器(杀死休眠)并重新启动一切,整个事情工作正常。所以我认为它与某些会话X将对象插入数据库以及其他会话Y试图在之后检索它有关。
会话是不同的并且源自不同的连接,并且特定的顺序存在于数据库中,所以我没有理由不返回该值。 我认为这与模型的缓存有关,但是我在休眠时很小心,所以我不能指出问题。
哪一行给你例外?您是否尝试过调试以获取更多信息? – Keppil
我已编辑该问题以提供更多信息 –
尝试启用[sql日志记录](http://www.mkyong.com/hibernate/hibernate-display-generated-sql-to-console-show_sql-format_sql-and- use_sql_comments /)在休眠,看看你是否从那里得到更多的信息。只是好奇:如果更新已有的对象('order')而不是再次询问Hibernate,会发生什么? – Salem