私は大学向けのプロジェクトを書いていますが、いくつかの奇妙な現象に遭遇しました。プログラムはレストランにサービスを提供することになっているため、さまざまなフロントエンドのすべてのニーズを管理するサーバー側があります。異なるフロント エンドは、「ディナー ターミナル」、「キッチン ターミナル」、「ウェイター ターミナル」、および「管理ターミナル」です。
オブジェクトを DB に追加すると、それが DB に表示され、キッチン ターミナルがそれを受け取り、取得したオブジェクトが正しいものであることがわかります。
public void addSessionOrder(String id, SessionOrder sessionOrder)
{
Session context = clientSessions.get(id);
context.beginTransaction();
context.save(sessionOrder);
context.getTransaction()
.commit();
}
各端末 (接続) には休止状態の独自のセッションがあることに注意してください。
ただし、セッションオーダーのステータスを更新しようとすると、この例外が発生します
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 に対するクエリは、ord に null を返します。
私が気付いたもう1つのことは、サーバーをオフにして(休止状態を終了して)すべてを再起動すると、すべてが正常に機能することです。したがって、一部のセッション X がオブジェクトを DB に挿入し、他のセッション Y が後でそれを取得しようとしたという事実と関係があると思います。
セッションは異なり、異なる接続から発生し、特定の順序がDBに存在するため、値を返さない理由はありません。モデルのキャッシングと関係があると思いますが、私は休止状態の初心者なので、問題を特定することはできません。