2013-06-01 81 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次。 –