2010-12-20 7 views
0

私のプログラムには非常に奇妙な動作があります。私は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番目のエンティティマネージャは存在しないユーザを見ることができます。また、すべてのメソッドが

はおそらく事前

+1

あなたの説明は不明です。これらのクラスはEJB 3.0 Beanですか?どうやって彼らの方法を呼びますか?また、 '@ PersistenceUnit'は' EntityManager'を挿入できません。 – axtavt

+0

にいくつかの点を明確にするためにPS2が追加されました。コメントありがとうございました – Pitelk

+0

ステートフルまたはステートレスejbsを使用していますか?ステートフルの場合は、拡張されたペリシステンスコンテキストも使用していますか?もしそうなら、トランザクションを明示的にコミットしていますか? –

答えて

1

ユーザーオブジェクトが切り離され、データベースと同期していないとします。したがって、キャッシュから取得されます。ステートフルセッションBean内で拡張パーシスタンスコンテキストを使用していません。したがって、エンティティは、エンティティマネージャによってトランザクション内でのみ管理されます。 PK Idでユーザーを検索してみてください。

+0

この問題に正しいasnwer、2年後、私もこのスニペットを持っていないコードのしかし、私は類似の状況に遭遇しました。実際、問題は「キャッシング」でした。だから私はあなたの答えをcorrentとしてマークします。 to summurise:jpaキャッシングを「オフ」にすると、どのような場合でもエンティティが見つかりません。キャッシュオプションはPersistence.xmlで有効/無効に設定されています(eclipseリンクの使用:) – Pitelk

0

にありがとうTRANSACTIONTYPE.REQUIREDている、そのユーザが照会されているが、ユーザーの削除トランザクションがコミットされていません。したがって、私は取引を確認することをお勧めします。また、そのユーザーに異なるトランザクションであることを照会し、両方の操作が同じトランザクション内にある場合、エンティティ・マネージャーは削除されたユーザーを検出しません。

+0

削除トランザクションはコミットされます(少なくともユーザーが存在しないデータベースでは)。ユーザーの削除とゲームの作成は、実際には異なるトランザクションにあります。具体的には、ログアウトした後、ユーザーをログに記録するためにEJBを呼び出すデリゲートを呼び出す「ログイン」ボタンを押します。ユーザーが既にDBに入っている場合、彼が実行していなければ処理が進みます。他のページにリダイレクトされています)。それから、 "createGame"ボタンを押すとDBにユーザがいないので失敗します。 – Pitelk

+0

どのようなjpaの実装は?を使用していますか?また、エンティティクラスと削除とクエリコードを投稿することはできません.. –

関連する問題