私のプログラムには非常に奇妙な動作があります。私はentitymanger.remove(ユーザー)を使用してデータベースから「ユーザ」と呼ばれるオブジェクトを削除するいくつかの点で注釈entityMangerがエンティティを検出し、もう一方がエンティティを検出しません
@PersistenceContext(unitName="myUnitPU")
EntityManager entitymanger;
を用いてそれぞれにEntityManagerを注入している2つのクラス(クラスログインおよびCreateGame)からを有しますLogInクラスのメソッドビジネスロジックは、ユーザが(同時に)ゲームをホストして参加することができるので、ユーザを削除することによって、ユーザが作成したゲームに関するデータベースのすべてのエントリが削除され、ユーザが参加したゲームを示すすべてのエントリが削除されるまた、
はその後、私は、ユーザーがログインクラス驚いたことに、ユーザを見つけ
entitymanager.find(user)
方法を用いて、存在するかどうかを確認する別の関数を呼び出します。その後、私は、そのクラスは、ユーザーが除去されると期待された結果であるユーザーを(見つけることができないで再び
entitymanger.find(user)
entitymangerを使用してユーザーを見つけようとするCreateGameクラスのメソッドを呼び出すと、それはではありません
したがって、問題は次のようなものです。あるクラスのentitymanagerが、他のユーザーが見つけられないユーザー(間違っている)を見つけたのはなぜですか? 誰も同じ問題を抱えていますか?
PS:この「バグ」は、ユーザーが別のユーザーによって参加された(Buserに電話をかける)ゲームをホストし、Buserが現在のユーザーによって参加されたゲームを行った場合に発生します。ユーザを削除することにより、この場合には、game1が削除され、ユーザがgame2 から除去される
GAME | HOST | CLIENTS
game1 | user | userB
game2 | userB | user
ので結果は
GAME | HOST | CLIENTS
game2 | userB |
PS2である: 豆はEJB3.0です。メソッドはデリゲートクラスから呼び出されます。デリゲートクラスのBeanは、InitialContext.lookup()メソッドを使用してインスタンス化されます。 ログイン、ゲームの作成、参加には、適切なデリゲートクラスがトランザクションを実行する通信相手のEJBを呼び出すことに注意してください。 logOutの場合、デリゲートはEJBを呼び出してユーザーをログアウトしますが、他のものを実行しなければならないので(上記のように)、このEJBはremovegame()、removeUserFromGame()などのメソッドを持つ他のEJB(lookupこれらのメソッドが実行された後、ユーザーはログアウトされます。おそらく、それは最初のエンティティマネージャがデリゲートによって呼び出されたという事実と関係しているかもしれませんが、EJbの中から2番目のエンティティマネージャは存在しないユーザを見ることができます。また、すべてのメソッドが
はおそらく事前
あなたの説明は不明です。これらのクラスはEJB 3.0 Beanですか?どうやって彼らの方法を呼びますか?また、 '@ PersistenceUnit'は' EntityManager'を挿入できません。 – axtavt
にいくつかの点を明確にするためにPS2が追加されました。コメントありがとうございました – Pitelk
ステートフルまたはステートレスejbsを使用していますか?ステートフルの場合は、拡張されたペリシステンスコンテキストも使用していますか?もしそうなら、トランザクションを明示的にコミットしていますか? –