問題タブ [jpa]
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.
java - Maven でのテスト用に JPA を構成する方法
デプロイに使用される通常のファイルの代わりにテストに使用されるように、Maven プロジェクトに 2 番目の persistence.xml ファイルをセットアップする方法はありますか?
私はpersistence.xmlをsrc/test/resources/META-INFに入れてみました。これはtarget/test-classes/META-INFにコピーされますが、target/classes/META-INFのようです(src/mainからのコピー/resources) が優先mvn -X test
されますが、クラスパス エントリが正しい順序でリストされています。
JPA 構成のデプロイメント バージョンを変更する必要なく、理想的にはプロジェクト チェックアウトの直後に、ローカルでの微調整を必要とせずに、単純な hsqldb 構成に対してテストを実行できるようにしたいと考えています。
database - 大規模なデータセットをバッチ インポートする際のデータベース パフォーマンスに関するアドバイス
Java と Hibernate の JPA 実装を使用してデータベース Web アプリケーションを構築しています。アプリケーションはオブジェクトを追跡します。また、レガシー ソースからオブジェクトをバッチ インポートする必要があります。
たとえば、人を追跡しているとしましょう。データベースには、Person および Address というテーブルがあります。対応する JPA エンティティと DAO クラスがあります。
JPAレイヤーの上には、さまざまな操作を担当するサービスレイヤーがあります。1 つの操作は、外部のレガシー ソース (電話帳の人など) から潜在的に大きなデータ セットをインポートすることです。人ごとに、データベースに既に存在するかどうかを確認する必要があります。次に、必要に応じて人物を作成または更新する必要があります。各人は住所を持っているため、適切な相互参照と住所の作成も行う必要があります。
私の問題は、この操作が大きなデータ セットに対して遅くなる可能性があることです。私の現在のアルゴリズムは次のとおりです。
パフォーマンスを向上させるために何をお勧めしますか?
頭のてっぺんから次のことを考えることができます:
- クエリを使用してデータを取得し、データベースに保存するようにインポート ロジックを変更します。たとえば、人が for ループ内に存在するかどうかを確認する代わりに、すべての人のキーを 1 つのクエリでデータベースに送信します。各プロセスはメモリ内の人を取得します。
- DAO クラスに独自のキャッシュを追加します。
- 外部キャッシュ ソリューション (memcached など) を使用します。
クエリを最小限に抑えるために再構築することで、常に#1を使用できます。欠点は、サービス層が DAO 層を非常に認識していることです。その実装は、下位のデータベース層によって決定されるようになりました。メモリの使用量が多すぎるなどの問題もあります。このデータベースから取得してからメモリ内で処理する方法は、非常に自家製のようであり、JPA のような市販のソリューションに反します。この場合、他の人がどうするか興味があります。
編集:ループ内でクエリされる各人が異なるため、キャッシュは役に立ちません。
java - 実行時の JPA カスケード オプション
すべての変更を監視し、すぐに問題のオブジェクトを永続化することで、オブジェクト モデルをデータベースと同期させるアプリケーションを作成しようとしています。モデル内のオブジェクトの多くは、大きなリストまたはツリーに子を持っています。
データベースからオブジェクトをロードするときは、一方向のカスケード関係に依存して、そのすべての子も取得し、アプリケーションに含めます。
ただし、永続性を必要とする親オブジェクトのフィールドを変更することは可能であり、影響を受ける子はないと判断できます。したがって、カスケードされたすべての子が永続化された状態でデータベースにアクセスすることなく、親を永続化したいと考えています。
例えば
親オブジェクトを永続化するときにカスケード オプションをオーバーライドするにはどうすればよいですか? それとも、単に REFRESH に設定して、カスケード永続化が不要であることを確認する必要がありますか?
hibernate - Hibernate と JPA の違いは何ですか?
誰かがJPAとHibernateの違いを概観できますか? それとも、これらは補完的な概念であり、一緒に使用されますか?
gwt - GWT アプリケーションで JPA を使用する最も簡単な方法
RPC を使用する単純な Google Web Toolkit アプリケーションを作成したいと考えています。永続性については、Java Persistence API のようなものを使用したいと考えています。
これは、Glassfish のようなアプリケーション サーバーを使用する必要があるということですか? または、単純な Web コンテナーを使用できますか?
具体的なライブラリに関しては、どのように進めればよいですか? トップリンク? 冬眠?...
sql - JPAでクエリ交差を取得しますか?
私が持っているもの: "image" 1:Many "imageToTag" Many:1 "tag"
少なくともタグ[a、b、c]を持つすべての画像を返すクエリを発行したいと思います。これをJPQLでどのようにモデル化できるかは私にはわかりません。クエリ文字列を動的に作成することはできますが、パフォーマンスとセキュリティ上の理由からそれは悪いことです。何か案は?
jpa - EJB2.x BMP エンティティ Bean の移行
BMP (Bean Managed Persistence) を備えた EJB2.x エンティティ Bean を使用します。BMP は EJB3 ではサポートされていないようです。私たちは最新の状態を維持し、EJB3 にアップグレードしたいと考えていました。実際に 3.0 で利用可能な BMP オプションがあるかどうか、誰か知っていますか?
私が知る限り、3.0 を使用すると、すべてのエンティティ Bean は JPA を使用し、定義上 ORM を使用する必要があります。ネイティブ SQL を使用するオプションはいくつかありますが、それは JPA を使用して ORM を実装する方法にすぎません。
EJB2.x BMP エンティティ Bean と同じ機能を実現する別の EJB3 アプローチがあるかどうかはわかりませんでした。現在、標準の ejbStore メソッドを使用してネイティブ SQL を介して DB を更新し、ejbLoad メソッドを使用してすべての Bean を検索し、トランザクションのロールバックが発生した場合に Bean を更新します。EJB3 セッション Bean でこれができるのではないかと思っていましたが、よくわかりませんでした。
おそらく、EJB3 Bean に移行する代わりに、Spring に移行する必要があります。
java - Ordering return of Child objects in JPA query
So if my JPA query is like this: Select distinct p from Parent p left join fetch p.children order by p.someProperty
I correctly get results back ordered by p.someProperty, and I correctly get my p.children collection eagerly fetched and populated. But I'd like to have my query be something like "order by p.someProperty, p.children.someChildProperty" so that the collection populated inside each parent object was sub-ordered by someChildProperty.
This seems intuitive when I think in terms of the sql that is actually generated for these calls, but I guess less so when it tries to map back to hierarchical objects.
performance - null 値を使用した JPA/Hibernate クエリの最適化
Hibernate の JPA 実装を使用していますが、フェッチされるエンティティごとに複数の SQL クエリが発行されるため、パフォーマンスが低下しています。結合された JPA クエリを使用すると、SQL クエリが 1 つだけ生成されますが、行が null 関係になることがわかりません。
例として、次の単純なスキーマを考えてみましょう。個人はある住所に住んでおり、会社に雇用されています。住所と雇用主はどちらもオプションであるため、null にすることができます。
上記には示されていませんが、各 JPA エンティティには何らかの ID (キー) があります。
私が見ている問題は、Person に対する 1 つの JPA クエリが、データベースに対して複数の SQL クエリを生成することです。たとえば、次の JPA クエリ:
SQL クエリの結果:
また、取得した人物ごとに次の SQL クエリのペアも使用します。
これはパフォーマンスに大きな影響を与えます。クエリの結果セットが 1000 人の場合、1+1000+1000=2001 の SQL クエリが生成されます。
そこで、強制的に参加させて JPA クエリを最適化しようとしました。
また:
これにより、多数の結合を含む 1 つの SQL クエリが生成されます。問題は、住所または雇用主が null の場合、結合されたクエリでそれが見つからないことです。
そのため、遅い結合のないクエリを使用するか、行を取得しない高速の結合クエリを使用すると関係が null になります。ここで何かが欠けているに違いありません。確かに、高速で完全なクエリを実行する方法はあります。
java - HibernateまたはTopLinkの代替手段ですか?
Hibernateの実行可能な代替手段はありますか?できれば、JPAに基づかないものが望ましいです。
私たちの問題は、複雑な(多くのオブジェクトが相互に参照しているように)ステートフルRIAシステムを構築していることです。Hibernateは、主に1回限りのアプリケーション(JSFなど)で使用するように設計されているようです。
問題は主に遅延読み込みの問題です。初期化と実際にレイジーコレクションをロードするまでの間に複数のHTTPリクエストが存在する可能性があるため、トランザクションごとのセッションは問題外です。トランザクションが障害にぶつかって例外をスローすると、セッション全体が無効になり、遅延ロードされたオブジェクトが破損するため、長期間有効なセッション(アプリケーションごとに1つ)もうまく機能しません。次に、私たちには機能しないあらゆる種類のものがあります(初期化されたトランザクションの外部からのデータの暗黙的なデータ永続化など)。
私の貧弱な説明はさておき、肝心なのは、Hibernateは私たちが好きではない魔法をやっているということです。TopLinkはこれ以上優れていないようで、EJBの上に記述されています。
したがって、ステートレス永続化レイヤー(または十分に明るいオブジェクト指向のデータベース抽象化レイヤー)が最も必要なものです。
何か考えがありますか、それとも私は存在しない何かを求めていますか?
編集:あいまいな用語をお詫び申し上げます。訂正と洞察に満ちた回答をありがとうございました。私を訂正した人たち、あなたはすべて正しいです、私はEJBではなくJPAを意味しました。