我正在爲大學寫一個項目,並且遇到了一些奇怪的現象。 程序應該服務於一家餐廳,因此它有一個服務器端,管理不同前端的所有需求。不同的前端是「晚餐終端」,「廚房終端」,「服務員終端」和「管理終端」。休眠無法從數據庫檢索對象
當我添加一個對象到數據庫時,我在數據庫中看到它,廚房終端收到它,我發現它得到的對象是正確的。
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