問題タブ [guice-persist]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
jpa - Guice Persist は、トランザクション スコープまたはアプリケーション管理の EntityManager を提供しますか?
Guice Persistを使用して、プロジェクトに EntityManager を挿入します。
例えば
EntityManager
しかし、注入された のインスタンスがどのように使用されようとしているのかは不明です。
- これはどのタイプの EntityManager ですか? (例:エンティティ マネージャのタイプを参照) 内部では、Guice Persist がそれをインスタンス化する
EntityManagerFactory.createEntityManager()
ため、アプリケーション管理のエンティティ マネージャと言えます。しかし、公式の Wikiでは、トランザクションごとのシード戦略について書いています。これは、EntityManager が (疑似) トランザクション スコープであることを示唆しています。 - 手動で close() を呼び出す必要がありますか? それとも Guice が処理しますか?
- 一次キャッシュの範囲は?
EntityManager
(トランザクション スコープのエンティティ マネージャーのように) 単一のトランザクションのみか、または(アプリケーション管理のエンティティ マネージャーのように)の同じ注入されたインスタンスを使用する限り?
java - JPA、Eclipselink、および Guice での NullPointerException
次のような JpaController クラスがあります。
をインストールしてcom.google.inject.persist.PersistFilter
います (この時点では HTTP リクエストに参加していないため、フィルタリングはしていませんが、バックグラウンド スレッドです)。
私もインストールしますnew JpaPersistModule(PU)
EntityManager が正常に読み込まれたと思います (ただし、コードがその行に到達していないため、これについては確信が持てません)。
スローされる例外は、インターセプターからのものです@Transactional
使用したライブラリ: EclipseLink 2.4.1、guice 3.0、guice-persist 3.0、guice-jndi 3.0、guice-servlet 3.0、MySQL 5.1.25、javax.persistence 2.0.4、Jackson、activemq、lombok、joda-time、javax。メール、javax.inject、asm、jersey、log4j、jettison、jsr311。
java - Guice-JPA persistance.xml がプロパティ ファイルからプレースホルダーを読み取らない
DAO操作を実行するために休止状態でGuice-JPAモジュールを使用しています。
persistence.xml で接続情報をハードコーディングすると、すべてが正常に機能します。しかし、接続パラメーターにプロパティ ファイルを使用しようとすると、persistence.xml はそれらを空の文字列として扱い、例外が発生します。
これが私のguiceコードとPersistense.xmlです。
このコードの後、プロパティ オブジェクトがすべてのプロパティを保持していることをデバッガから確認したので、プロパティ ファイルを正しく読み取ったことを確信しています。
ここにプロパティファイルとpersistence.xmlがあります
次の例外が発生します。
プロパティ ファイルが JPA モジュールによって読み取られない理由についてアドバイスをお願いします。
guice-servlet - guice-persist を使用すると、エンティティへの更新が認識されないか、永続化されない
エンティティの値を更新してその更新を永続化しようとする guice-persist および guice-servlet (http-request スコープの jpa セッション) に問題がありますが、更新はデータベースに永続化されません。entityManager.flush()
andを使用して書き込みを強制しようとしましたentityManager.getTransaction().commit()
が、ログを見ると、http セッションが終了して jdbc 接続が解放されても、何も起こらないようです。
通常、休止状態が sql update ステートメントを発行することを期待しますが、更新は登録されないようです。私が奇妙に感じるのは、新しいエンティティの作成に問題がないことです。これは更新に影響しているように見えるだけです。
注入された UserDao を使用する Singleton スコープのサーブレットがありますProvider<EntityManager>
。
ここに私のpersistence.xmlがあります:
MySQL および Derby データベースを使用して、この問題を再現しました。
失敗する更新試行の例を次に示します。
DurableUser
(以前の http セッションで問題なしで作成された) を取得し、フィールドを更新します。明示的なflush()
andがあってもcommit()
、休止状態は update ステートメントを発行しません。
更新されたフィールドを示すorg.hibernate.internal.util.EntityPrinter
ユーザーの をログに記録するログに気付きました。toString()
それは、休止状態がエンティティが汚れていることを認識し、まだ変更を保持していないことを意味しますか?
新しいエンティティを正常に作成できるのに、既存のエンティティを更新できない理由を誰でも答えることができますか? これまでのところ、私は完全に困惑しています。
編集:セッションからのログは次のとおりです。
guice - createInjector の奇妙なエラー「メソッドをインターセプトできません」
私はguiceの経験があり、guice-persistを試しました。しかし、非常に単純なモジュールで非常に奇妙なエラーが発生しました。これは私のモジュールです:
サービスのインスタンスを取得するために、ファクトリを作成しました (これはこの API を使用するためのもので、メインはありません)。
VotingService とその実装は、単純なデータベースの対話をカプセル化します。この「VotingServiceImpl」では、EntityManager のみを注入し、一部のメソッドで @Transactionl を使用します。だから、なぜ私は得る
? この単純なテストでエラーがスローされます。
編集 このエラーは、バインドされた実装で @Transactional が使用されている場合にのみ発生します。AOP で問題が発生しましたが、どうすれば修正できますか? 編集
java - @Transactional アノテーションがトランザクションを開始しない (Guice Persist)
Guice Persist を使用して @Transactional アノテーション付きメソッドで単純なサービス クラスを作成しようとしています。
残念ながら、Guice Persist によって作成されるトランザクションはありません。ログ出力はここで見ることができます: http://pastebin.com/Mh5BkqSC
450 行目の印刷に注意してください。
トランザクションはアクティブですか? 間違い
その結果、データベースには何も保存されません。
次の方法でアプリケーションをセットアップします。
ご覧のとおりTestService
、 は Guice によって作成されており、私は を使用してJpaPersistModule
い@Transactional
ます。
問題を示す小さな Maven プロジェクトを作成しました: https://github.com/uldall/guice-persist-error
hibernate - JPA @ElementCollectionが不思議なことにキャッシュされました
私のPOJO(Categoryという名前)には、マッピングlangMap
を格納する (Language Map) があります。Locale -> String
次のように定義されています。
マップを更新するまではうまく機能します: コードは単純です:
すべてをクリアしてlangMap
、新しい値を入力します。(確かに、それは@Transactional
merged() です)
しかし、ビューレイヤーを更新すると、古いマップの結果が表示されることがあります。キャッシュレイヤーを追加していないと確信しています。
ここに私が見るものがあります:
たとえば、 を格納するカテゴリが 1 つあります。
mysqlでは正しく表示されます:
ビューレイヤーでは、意図的に各名前に「X」を追加しました。
コミット後、古いマップが正しく置き換えられ、mysql で値が実際に変更されます。
しかし、そのようなページをリロードすると、古い地図が表示されることがあります (常にではなく、約 50/50 ):
Category
ログは、ビュー層ではなく、ドメイン オブジェクト () に書き込まれます。更新するたびに、 POJO でログがトリガーされます。したがって、ビューレイヤーは何もキャッシュしていないと確信しています。
メモリから消去されていない古いものがあるようでlangMap
、休止状態は時々そのバージョンを取得します。もう一度修正すると、ランダムにローテーションする 3 つのバージョンのマップが表示されます。これは奇妙です。
サーバーを再起動するだけで、常に正しいlangMap
.
ここで何が間違っている可能性がありますか?
環境 :
- - - - - - 更新しました - - - - - -
好奇心から、CategoryDao.get(1)
本当に db にヒットするかどうかを調べたいと思います。をオンにしhibernate.show_sql=true
、いくつかのログインを追加してからCategoryDao.get(1)
、プロセスを再実行しました。
そして結果:
すべてget()
がロガーをトリガーしますが、予想どおり、古いデータには SQL ログが表示されません。彼らはデータベースにアクセスしていないようです。最新のデータに SQL ログが表示されないことがあります。とにかく、SQLコードが表示されれば、結果は間違いなく最新です。
これはキャッシュの問題のようです。ただし、ここではキャッシュ (ehcahce を含む) を使用していません。hibernate.cache.use_query_cache
とhibernate.cache.use_second_level_cache
を false に設定しましたが、無駄でした。
ここで何が間違っている可能性がありますか?
------------ 更新 2 ------------
@Transactional
コメントで、 DAOのget(id)
方法を紹介することで問題を解決できると思いました。ただし、(Web の) アクション全体がカテゴリのみを取得する場合にのみ機能します。たとえば、次は問題ありません。
カテゴリをどのように変更しても、正常に機能langMap
しlangMap
、 db に正しく保存され、 db から取得されます。SQL が表示されます。すべてget(id)
が実際にデータベースにヒットします。
しかし実際には、このアクションは通常、1 つのカテゴリ オブジェクトをレンダリングするだけではありません。たとえばsubCategories
、カテゴリの下のアイテムまたはアイテムをフェッチする他のクエリがあります。
そんなアクションも良さそうですが、オフラインテストもOK。しかし、オンラインの場合、カテゴリの を更新した後langMap
、不思議なことにキャッシュされlangMap
た が再び浮き上がることがあります (WTF!)。また、categoryDao.get(id)
常に DB にヒットするとは限りません。
さて、ここで何が間違っているのでしょうか?
java - jpa2 は、guice を使用して entityManager を再利用します
私は本当に指を置くことができないいくつかの奇妙な動作をする Web アプリケーションを持っています。私の問題の核心は、残りのエンドポイントによって返される値に一貫性のない動作があることです。アプリケーションを起動すると、このエンドポイントを呼び出すたびにクエリが同じ値を返します。エンティティを更新すると、エンティティ マネージャーの動作がおかしくなり始めます。今、私のクエリは異なる結果を返し始めます。データベースにある値の代わりに古い値を返すか、結果リストにオブジェクトではなくプロキシが含まれている場合があります (混合)。
@transaction メソッドが正しく配置されていることを確認し、デバッグ スタックにトランザクション インターセプターが表示され、エンティティ マネージャーがバックエンドへの要求ごとに作成されます (したがって、guice 永続フィルターはありません)。
私の感覚では、問題はセッション コンテキストにあることを示しています。複数のリクエストで永続化コンテキストを再利用しているように感じます (しかし、実際には把握できません)。
これをすべて機能させるために、いくつかのフレームワークをまとめました。私は jax-rs 実装者として resteasy を使用しています。cdi 実装者として guice (4.0beta4) を、jpa 実装者として hibernate を実行します。entitymanager を注入するときにプロバイダーを使用する必要があるため (entitymanager はトランザクションごとに作成されるため)、これを EntityManagerProxy でラップしました。このクラスは EntityManager インターフェースを実装し、すべてのメソッドを provider.get().method() に委譲します。
私のguiceモジュールは次のようになります
これは漠然とした問題であることはわかっていますが、誰かが正しい方向に私を助けることができますか? これは、エラー メッセージを提供できる問題ではありません。
編集:問題を特定しました。プロファイラーを使用して、エンティティコンテキストが偽装によって再利用されていることを確認しました。これは、毎回クエリを実行するのではなく、@transactional アノテーションが渡されるたびに作成する必要がある既存のエンティティ マネージャーを使用することを意味します。