2013-06-01 44 views
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()返回DB中对应对象的所需ID(存在) DB上的查询返回null给ord。

我注意到的另一件事,如果我关闭服务器(杀死休眠)并重新启动一切,整个事情工作正常。所以我认为它与某些会话X将对象插入数据库以及其他会话Y试图在之后检索它有关。

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

+0

哪一行给你例外?您是否尝试过调试以获取更多信息? – Keppil

+0

我已编辑该问题以提供更多信息 –

+0

尝试启用[sql日志记录](http://www.mkyong.com/hibernate/hibernate-display-generated-sql-to-console-show_sql-format_sql-and- use_sql_comments /)在休眠,看看你是否从那里得到更多的信息。只是好奇:如果更新已有的对象('order')而不是再次询问Hibernate,会发生什么? – Salem

回答

0

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

ord对象为null,因此它引发NPE。我想休眠无法找到具有给定ID的订单。

在这里添加一些日志,你会看到是什么原因造成你的问题

+0

好..如果代码在该行失败,那告诉我该ord对象是空的。在这条线上没有更多的NPE – WeMakeSoftware

+0

确实,添加一些日志记录;)它肯定有帮助 – WeMakeSoftware

+0

这是一个日志,记录第一次点击http://pastebin.com/2zh841xc事件。在第1行,服务器收到一条消息以添加新订单。在第二行,服务器通知厨房它需要做的订单。在第3行,服务器收到一个持续的订单列表请求。在第4行,服务器发送持续的订单列表。在第5行,服务器收到来自厨房的第一次点击以更新订单的状态。在第6行记录了该错误。第13行是第二次尝试更新成功的状态,但需要在前端单击2次。 –