問題タブ [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 - EntityListeners から EntityManagers にアクセスできますか?
JSR-000220 Enterprise JavaBeans 3.0 Final Release (persistence) 仕様に次のように記載されていることは承知しています。
「一般に、ポータブル アプリケーションは、EntityManager またはクエリ操作を呼び出したり、他のエンティティ インスタンスにアクセスしたり、ライフサイクル コールバック メソッドで関係を変更したりしないでください。」
これは非常に制限的であると思われます。EntityListener 内から EntityManager にアクセスしたい状況があります。
Jboss/Glassfish、またはその他のアプリケーションサーバーのリスナー内から EntityManager を使用するときに、悪影響や落とし穴に遭遇した人はいますか?
hibernate - JPAでエンティティタイプを変更するには?
私の特定のケースでは、識別子列戦略を利用しています。これは、私の JPA 実装 (Hibernate) が特別なDTYPE列を持つusersテーブルを作成することを意味します。この列には、エンティティのクラス名が含まれます。たとえば、ユーザーテーブルにはTrialUserとPayingUserのサブクラスを含めることができます。これらのクラス名はDTYPE列にあるため、EntityManager がデータベースからエンティティをロードするときに、どのタイプのクラスをインスタンス化するかがわかります。
エンティティ型を変換する 2 つの方法を試しましたが、どちらも汚いハックのように感じます。
- ネイティブ クエリを使用して列に対して手動で UPDATE を実行し、その値を変更します。これは、プロパティの制約が類似しているエンティティに対して機能します。
- ターゲット タイプの新しいエンティティを作成し、BeanUtils.copyProperties()呼び出しを実行してプロパティを移動し、新しいエンティティを保存してから、新しい Id を古い Id に手動で置き換える名前付きクエリを呼び出して、すべての外部キー制約が維持されます。
#1の問題は、この列を手動で変更すると、JPAがこのエンティティを更新/永続コンテキストに再アタッチする方法がわからないことです。ID 1234のPayingUserではなく、ID 1234 のTrialUserが必要です。失敗します。ここで、おそらく EntityManager.clear() を実行して、すべてのエンティティをデタッチ/Per をクリアすることができます。コンテキストですが、これはサービス Bean であるため、システムのすべてのユーザーの保留中の変更が消去されます。
#2 の問題は、TrialUserを削除すると、Cascade=ALL に設定したすべてのプロパティも削除されることです。すべての拡張オブジェクト グラフを削除するのではなく、別のユーザーにスワップしようとしているだけなので、これは悪いことです。
更新 1 : #2 の問題により、ほとんど使用できなくなったため、動作させることをあきらめました。より洗練されたハックは間違いなくナンバー 1 であり、私はこの点である程度の進歩を遂げました。重要なのは、最初に基礎となる Hibernate Session への参照を取得し (JPA 実装として Hibernate を使用している場合)、Session.evict(user) メソッドを呼び出して、永続化コンテキストからその単一のオブジェクトのみを削除することです。残念ながら、これに対する純粋な JPA サポートはありません。サンプルコードは次のとおりです。
この例外をスローする手動のflush()に注意してください。
Userが OneToMany Set を持つMembershipエンティティが問題を引き起こしていることがわかります。舞台裏で何が起こっているのか、このナットをクラックするのに十分なほど知りません.
更新 2 : これまでのところ、上記のコードに示すように DTYPE を変更してから、 entityManager.clear()を呼び出すだけで機能します。
永続化コンテキスト全体をクリアすることの影響を完全には理解していません。代わりに、更新される特定のエンティティでSession.evict()を動作させたいと思っていました。
hibernate - マージ時にデータベース挿入を実行する JPA EntityManger?
JPA を Hibernate の下で使用しており、マージがうまくいかないのですが、JPA で発生している問題を説明する前に、問題が私のアプローチに起因する場合に備えて、私が達成しようとしていることを説明させてください。 .
別のシステムに配置する必要があるシステム上のデータがあります。これを行うには、データを読み取り、そのデータに基づいて新しい ORM オブジェクトを構築します。次に、ORM オブジェクトをデータベースに永続化します。データベースが空の場合、プログラムは簡単な em.persist(object) 呼び出しで問題なく動作します。ただし、データベースにデータが含まれているときにこのプロセスを実行し、必要に応じて新しいデータを追加し、古いデータを更新できるようにしたいのですが、ここで問題が発生しています。
アイテムがデータベースに既に存在するかどうかを確認する簡単なチェックを行い、何も見つからない場合は保持し、レコードが存在する場合はマージを試みます。重複レコード エラーで失敗します。
em.merge() 呼び出しが更新ではなく挿入を試みているのは奇妙に思えます (これは SQL ロギングで確認しました)。
サブオブジェクトにカスケードするオブジェクトを使用していることに注意してください。失敗はサブオブジェクトで発生しています。これは、最初にサブオブジェクトをマージしようとすることを期待しているため、私には理にかなっています。
以下は私のコードです。おおざっぱな状態で申し訳ありませんが、ここでいくつかの回避策を文書化しようとしました。
JPA の経験がある人が私を助けてくれれば、本当に感謝しています。Hibernate の saveOrUpdate() と JPA の merge() の違いは明らかに私をつまずかせますが、EnityManger のマージに関するいくつかの記事を読んだにもかかわらず、ここで何が起こっているのかについて頭を悩ませることはできません。
御時間ありがとうございます。
java - JPA/EclipseLink を使用してジャンクション テーブルから情報を取得するにはどうすればよいですか?
次の多対多マッピングがあります。
}
public class Cat implements { @Id @GeneratedValue private Integer yID;
}
オブジェクト名とプロパティ名は無視してください。これらは架空のものであり、無関係です。これはコンパイルされ、正常に動作します。私もこれを行うことができます:
私の問題は、データベースからオブジェクトを取り戻すときに発生します。
印刷物は次のとおりです。
3: {IndirectSet: インスタンス化されていません}
2: {IndirectSet: インスタンス化されていません}
これは正常な動作である可能性があります。テーブルからオブジェクトを取得すると、他のオブジェクトに関連するセットを設定する必要があるように思えます。つまり、ジャンクション テーブルは次のようになります。
X | よ
2 | 3
1 | 3
em.find(Cat.class,3) は getStudents() に対して {1,2} のセットを持つ Cat オブジェクトを返す必要があり、em.find(Student.class,2) は {3 のセットを持つ Student オブジェクトを返す必要がありますgetCats() の場合。
これを可能にする方法はありますか?
ありがとう、BJ
seam - リモート シームの持続性
リモートで Java 関数を呼び出す JavaScript 関数を呼び出す .xhtml ファイルにボタンがあります (jboss seam 環境で)。その Java 関数には、entityManager.persist(object) があります。このコード行が DB にコミットされない理由を知っていますか? トランザクションが開始されていないことを示しています。リモートコンテキストでは、トランザクションが開始されていないと思います。なぜなら、上記のjavascriptを使用する代わりに同じJava関数を呼び出すアクションをそのボタンに配置すると、正常に動作するからです。entityManager はオブジェクトを永続化し、DB でそれを見ることができます。
javascriptを使用してオブジェクトを実際に永続化してJava関数を呼び出す方法を知っている人はいますか? (コールバック関数が必要なため、javascript を使用する必要があります)
java - Spring MVC アプリケーションで Null EntityManger を修正しますか?
次のコードでは、注入された EnitityManager に問題があり、常に null として表示されます。
これは、 dispatcher-servlet.xmlで定義された Bean 定義です。
EnitityManager は、 persistence-context.xmlファイルで定義された tx:annotation ベースに基づいて注入する必要があります。
persistence-context はapplicationContext.xmlからロードされます
ORM エンティティが JAR ファイルとしてプロジェクトに含まれているため、クラスパスのインポートが行われます。構成ファイルを解析できない場合、Spring はアプリケーションのデプロイを許可しないため、persistence-context がロードされていると思われることに注意してください。
これが私のpersistence.xmlです。
そして私のweb.xml
誰か助けてくれませんか?
java - この状況でflush()(JPAインターフェース)を呼び出す必要がありますか?
すべてのエンティティを取得するためにflush()を呼び出すと、メモリからデータベースに永続化されるためです。したがって、不必要なflush()の呼び出しを使用しすぎると、時間がかかる可能性があるため、パフォーマンスに適していません。これは、flush()をいつ呼び出すべきかわからないシナリオです。
私の質問は、No.1フラッシュの呼び出しを回避できるかどうかということです。
私が心配しているのは、item.setOrder(ord)を実行するために、ordのデータベースIDが必要です。また、 em.persist(ord)のみを呼び出すとデータベースIDを生成できないため、item.setOrder(ord)の前にem.flush ()を呼び出す必要があります。それで、あなたの意見はどうですか?
前もって感謝します。
jpa - JPA EntityManager: なぜ merge() よりも persist() を使用するのですか?
EntityManager.merge()
新しいオブジェクトを挿入し、既存のものを更新できます。
persist()
なぜ(新しいオブジェクトしか作成できない)を使いたいのでしょうか?