問題タブ [entitymanager]
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 - JPA - 遅延読み込み - LazyInitializationException - 子コレクションにアクセスしていない場合
Stripes、Spring、JPA、および Hibernate を使用してプロジェクトを構築しています。多対 1 の子コレクションを持つオブジェクトがあります。ローディングをレイジーに設定しました。
データベースからこれらのオブジェクトのコレクションを取得すると、子コレクションに直接アクセスする段階はありませんが、LazyInitializationException が発生します。
遅延読み込みとは、参照されたときにのみ子オブジェクト コレクションをインスタンス化することを意味すると思いましたか? 私は同様の問題を調べてみましたが、このすべてを理解することはできませんので、明確にしていただければ幸いです。
面白いことに、私は常にこの関係を設定していましたが、実際に例外に気付いたのは、データベースを変更して子テーブルと適切な外部キー関係を持つようにしたときだけでした。
編集:スタックトレース:
スタックトレース:
java - 多層環境 (REST + EJB + Core) で JPA EclipseLink を使用して DB に接続するにはどうすればよいですか?
Glassfish v3 サーバーを使用しています。
通常、EJB3 + JPA (Eclipselink) との DB 接続は、@PersistenceUnit または @Persistencecontext を使用したインジェクションによって行われます。
ただし、私のアプリには3つのレイヤーがあります:
コア (ビジネス ロジック、エンティティ、例外処理などを含む)
その上に EJB を配置し、適切なコア オブジェクトとメソッドを呼び出してジョブを実行します。この EJB は、ERP の他の内部モジュールによって呼び出されます。
フロントエンド Web サイトで使用するための REST レイヤー。
EJB で entityManager も EMF (EM ファクトリ) も取得したくありません。これは、中間層がその下で使用される DB があることを認識しないようにするためです。結局、後で、コアの実装を DB を使用しない実装に変更することを決定できます。
私は2つの悪い解決策しか見ていません:
1) DB 接続が必要なコア層のメソッドを呼び出すたびに EM パラメータを追加します。非常に醜く、私が上で言ったことに反します。
2) DB 接続を必要とするコアのすべてのメソッドで、ファクトリ、EM を作成し、それらを使用してから、両方を閉じます。
Core レベルのクラスごとに 1 つのファクトリを持ち、すべてのメソッドで EM が作成され、閉じられます。しかし、私はまだこのようなメモリリークがあります:
私の EJB メソッドの 1 つが 10 個の異なるオブジェクトを使用すると、10 個の EM ファクトリが作成され、どれも閉じられていないためだと思います。
Core オブジェクトでの一般的な使用例:
解決策 2 を使用する必要がありますか? このコア レベルで単一の EM ファクトリを使用する方法はありますか? JPA 仕様では、EJB レベルでのみエンティティを使用することを想定しているようですが、これは多層アプリでは不適切です。
編集: @Inject を試した後の現在のステータスは次のとおりです。
CORE jar の /META-INF ディレクトリに空の beans.xml ファイルを追加しました。
親DAOクラスは次のようになりました:
public class ExampleBZL {
/li>Emf クラスは非常に単純で、ステートレスです。
@Stateless public class Emf は EmfAbstract を実装します {
}
私は何か間違ったことをしているに違いありませんが、グラスフィッシュではエンジンリストに「[ejb、weld、web]」が表示されているため、CDIがロードされていますが、インジェクションは機能しません。
他の注釈がありませんか?? これら 2 つの小さな注釈 (一方はステートレス、もう一方は注入) を使用して JAR で inect を実行することは本当に機能していますか?
java - SEAM: 動的にロードされるクラスで EntityManager と Logger を取得する方法は?
10 分ごとに実行されるバックグラウンド サービスがあります。
このサービスは、実行するジョブを DB にクエリし、ジョブに応じて (Class.forName() を使用して) 異なるビジネス ロジックを持つクラスをロードします。もちろん、それらは同じインターフェースを実装しています。
これらのクラスを SEAM コンポーネントとして宣言しましたが、entityManager または Logger を使用しようとすると NPE が発生します。
私自身の質問に答えると、これは Class.forName() が SEAM の注入メカニズムの下にあり、依存関係を注入する機会がないためだと思います。
クラスをロードした後、それらを自分で注入することで、おそらくそれを回避できます。それを行うより良い方法はありますか?
ありがとう!
java - EntityManagerが注入されていません
EntityManagerのNPEを取得していますが、その理由がわかりません。誰かが私の間違いを見つけることができますか?
UserManagerImpl.java
META-INF / persistence.xml
これらは私のejbjarプロジェクト内にあり、UserManagerImplはJSPから呼び出されますが、違いが生じるかどうかはわかりません。
前もって感謝します。
java - このクエリを変更して、`keywords` 値が null の場合でも、`minPrice` 条件を満たすレコードを返すにはどうすればよいですか?
これがGoogle App Engine for Java特有の問題かどうかはわかりませんが、keywords
パラメータとして設定した値がnull Stringの場合、aminPrice
を設定してもクエリから何も返されません。
このクエリを変更して、値が nullminPrice
の場合でも条件を満たすレコードを返すようにするにはどうすればよいですか? keywords
理想的には、null 文字列条件に基づいて別のクエリを作成せずに、両方の条件に同じクエリを使用することです。
java - JPA および EJB3 で JDBC ClientInfo を使用する方法
JDBC ベースのアプリケーションを JPA および EJB3 に移行しています。私たちの古いアプリケーションは、Connect#setClientInfo API を使用して、現在のユーザー名をクライアント情報の一部として記録しました: http://download.oracle.com/javase/6/docs/api/java/sql/Connection.html#setClientInfo% 28java.lang.String,%20java.lang.String%29
EJB3 プロジェクトでも同様のことを行う必要があります。どのように?
現在のユーザーを取得してデータソースの情報として設定するために、EJB サービス呼び出しの周りで EJB3 インターセプターを使用できます。ただし、これには問題があります。JPA flush() がいつ発生するかは保証されていないと思います。クライアント情報をインターセプターに設定し、いくつかの更新を行ってから戻った場合、Bean (およびインターセプター) が範囲外になるまで、flush() と実際のデータベース書き込みは発生しない可能性があります。これは正しいです?
JPA と EntityManagers は接続を介した抽象化であり、接続でクライアント情報を確実に設定することはできません。正しいか間違っているか?
ejb-3.0 - EJB3セッションBeanのコンストラクターを定義する方法
特定のファサード/実装デザインパターンを尊重しようとするEJB3モジュールを作成しています。私のファサードは完全にEJBフリーである必要があります。
このモジュールには、エンティティBeanとこのエンティティのマネージャであるセッションBeanの2つのクラスがあります。マネージャには、EntityManager属性が含まれています。
マネージャーBeanをインスタンス化するファクトリもありますが、このファクトリはマネージャーの実装を認識していません(したがって、EJBについては認識していません)。ファクトリは、プロパティファイルを使用してのみマネージャのクラスの名前を取得できます。次に、ファクトリはマネージャをインスタンス化します。
私の質問は、マネージャーの実装でコンストラクターを宣言してから、そのコンストラクター内でEntityManagerを初期化できるかどうかです。
通常、EntityManagerの上にある@PersistenceContextアノテーションを使用します。
しかし、クラスが直接インスタンス化されている場合、これは明らかに機能しません。
私はこのようなことを試みました:
しかし、その後、NoInitialContextExceptionが発生します。明らかに、JNDIコンテキストが正しく初期化されていません。
誰かがここで私を助けてくれますか?
ありがとう
java - javaとjboss、SQLサーバーを使用。複数のentitymanagerを使用したネイティブクエリにステートメントを挿入しますが、機能しません。しかし、SQLでは機能します
eclpiseデバッガーを使用すると、使用されている文字列を確認できます。SQLServer Management Studioにコピーして貼り付けると正常に機能します。したがって、複数行のステートメントが気に入らないエンティティマネージャーと関係があると思います... ?
ありがたいことにアドバイスを受け取りました(ええ、stringbuilderなどについて知っています)。私が得るエラーは次のとおりです。
EDIT は、挿入がentitymanagerおよびqueryクラスでサポートされていないことが判明しました。したがって、プリペアドステートメントを使用するか、オブジェクトを永続化する必要があります。
java - JPA - メソッドが @Transactional の場合にのみデータベースが更新される
よくわからない問題に遭遇しました。DAO で動作するメソッドに @Transactional という注釈が付けられていない限り、基礎となるデータベースは更新されません。私のアプリは JPA/Hibernate、Spring、Wicket で動作します。何故ですか?
ダオ:
サービス:
@Transactional アノテーションを省略した場合、データベースは更新されません。
java - JPA 1.0 エラー: 名前は認識されたエンティティーまたは識別子ではありません。既知のエンティティ名: []
単純な JPA 1.0 コードを実行しようとすると、次の例外が発生します。原因は何ですか?