私のプログラムでは非常に奇妙な振る舞いをしています。2つのクラス(クラスLogInとCreateGame)があり、アノテーションを使用してそれぞれにEntityManagerを挿入しました
@PersistenceContext(unitName="myUnitPU")
EntityManager entitymanger;
ある時点で、LogInクラスのメソッドからentitymanger.remove(user)を使用して、データベースから「user」というオブジェクトを削除します。ビジネスロジックでは、ユーザーはゲームを(同時に)ホストして参加できるため、ユーザーが作成したゲームに関するデータベース内のすべてのエントリが削除され、ユーザーが参加したゲームを示すすべてのエントリが削除されます。また。
その後、LogInクラスのメソッドを使用してユーザーが存在するかどうかを確認する別の関数を呼び出します
entitymanager.find(user)
驚くべきことに、これはユーザーを見つけます。その後、CreateGameクラスのメソッドを呼び出して、もう一度使用してユーザーを見つけようとします。
entitymanger.find(user)
そのクラスのentitymangerはユーザーを見つけることができません(これは、ユーザーが削除され、データベースにないために期待される結果です)
したがって、問題は次のとおりです。一方のクラスのentitymanagerが、もう一方のクラスがユーザーを見つけられないのに(間違っている)ユーザーを見つけるのはなぜですか?誰かが同じ問題を抱えたことはありますか?
PS:この「バグ」は、ユーザーが別のユーザーが参加しているゲームをホストし(彼をBuserと呼びます)、Buserが現在のユーザーが参加しているゲームを作成した場合に発生します。
GAME | HOST | CLIENTS
game1 | user | userB
game2 | userB | user
この場合、ユーザーを削除すると、game1が削除され、ユーザーがgame2から削除されるため、結果は次のようになります。
GAME | HOST | CLIENTS
game2 | userB |
PS2:BeanはEJB3.0です。メソッドはデリゲートクラスから呼び出されます。デリゲートクラスのBeanは、InitialContext.lookup()メソッドを使用してインスタンス化されます。ログイン、作成、ゲームへの参加のために、適切なデリゲートクラスがトランザクションを実行するコレスポンデントEJBを呼び出すことに注意してください。logOutの場合、デリゲートはEJBを呼び出してユーザーをログアウトしますが、他の処理を行う必要があるため(上記のとおり)、このEJBはremovegame()、removeUserFromGame()などのメソッドを持つ他のEJBを呼び出します(ここでもlookup()を使用)。これらのメソッドが実行された後、ユーザーはログアウトされます。おそらく、最初のエンティティマネージャがデリゲートによって呼び出され、2番目のエンティティマネージャがEJb内から呼び出されるという事実と関係があります。そのため、一方のエンティティマネージャは存在しないユーザーを表示でき、もう一方は表示できません。また、すべてのメソッドにはTRANSACTIONTYPE.REQUIREDがあります
前もって感謝します