問題タブ [hibernate-session]

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.

0 投票する
2 に答える
231 参照

java - データベース内のデータに対してオブジェクトのインメモリ バージョンをチェックする

update()への呼び出しで、メモリ内の変更されたオブジェクトをデータベースに既に保存されているデータと比較する必要がある Hibernate プロジェクトがあります。たとえば、私のビジネス ロジックでは、レコードが「有効」である (有効日が今日またはそれ以前である) 場合、更新によって有効日を変更することはできません。これを達成するために、次のコードがあります (少し長くて複雑です)。

マネジャー

ダオ

クライアントコード

マネージャーに呼び出しを追加する前にevict()、マネージャーが予期しない方法で動作していることに気付きました。レコードを更新するには、まず を呼び出してそのレコードを取得する必要があります。これによりfindById()、レコードがセッション キャッシュに入れられます。そのオブジェクトに変更を加えてから、(おそらく)永続化されたデータを取得するためにupdateRecord()呼び出す呼び出しを行います。この 2 回目の呼び出しは、データベース データを参照するのではなく、キャッシュからオブジェクトをプルするだけであるfindById()ことに気付きました。これにより、とがまったく同じオブジェクトになるため、常に新しく変更された日付と同じになります。findById()oldEffectiveDate recordoldRecord

これに対抗するために、 への呼び出しを追加しましたevict()。これは、オブジェクトがキャッシュから削除され、Hibernate がデータベースにアクセスしてMemberRecord. その変更を行った後、 をMemberRecordDAO呼び出すと例外がスローuniqueResult()されますAssertionFailed: possible nonthreadsafe access to session。デバッガーを実行すると、 と の両方が同じ を使用していることがわかりLogicManagerますMemberRecordDAOSessionこれは正しいと思いました。

だから、私の質問:

  1. 私の考え方/アルゴリズムは正しいですか? 正しいevict()ことはありますか?より良い方法はありますか?私はセッション、キャッシング、またはevict(). スレッドの問題に対処する前に、このロジックが正しいことを確認したいと思います。
  2. SessionDAO からのアクセスがスレッドセーフでないのはなぜですか?
0 投票する
1 に答える
164 参照

hibernate - アイテムを休止状態で削除

HQL を使用してオブジェクトを削除しようとすると、hiberate を使用するsession.CreateQuery().executeUpdate()と、1 つのアイテムが削除されたことが返されます。ただし、データベースでは何も削除されていません。その後executeUpdate、フラッシュもしました。

ここで何が問題なのか、誰か提案してもらえますか?

0 投票する
3 に答える
1203 参照

java - Hibernate session.load がオブジェクトの arraylist プロパティを埋めない

hibernate の session.load 関数の使用に問題があります。ID に従ってオブジェクトを取得しようとすると、適切なオブジェクトが返されますが、インスタンスにはプリミティブ プロパティしか設定されていません。セット (他のオブジェクトにマップされている) を持つプロパティがありますが、セット後に取得されず、セットのフィールドが null です。

フェッチが期待どおりに機能しない理由を誰かが知っていますか?

ありがとう

0 投票する
2 に答える
4783 参照

hibernate - Hibernate、セッション、遅延読み込み

HibernateとJSF/primefacesを使用してJavaWebアプリケーションを開発しています。次のようなエラーが発生することがあります

1)同じ識別子を持つオブジェクトはすでにセッションに関連付けられています。

2)遅延初期化のロードに失敗しました*、セッションが存在しないか、セッションがすでに閉じられています。

これは私のアプリの不適切なコーディングが原因であることを私は知っています。これはaapを行う方法です:

ユーザーがページを要求したとき(それを従業員のリストとします)。ユーザーは従業員リストページ(empployeeList.xhtml)を取得します。EmployeeListMBeanはこのページの管理対象Beanです。コンストラクターのマネージドBeanで、メソッドpopulateEmployees()を呼び出しています。PopulateEmployee()は、EmployeeDaoメソッドgetAllEmployee()を使用してgetAllemployeesを取得します。

従業員クラスはここに行きます:

これが私のEmployeeDaoです:

質問1)ここで、メソッドでセッションを閉じてから、結果をマネージドBeanに返します。したがって、従業員リストページでは、テーブルに名前dobdateOfHireがリストされます。そして、私はバウトンビューをより詳細に持っています。このボタンをクリックすると、同じ管理対象Beanを使用して作業している選択した従業員のすべてのプロジェクトを表示したいのですが、エラー(2)が発生し、レイジーロードに失敗し、セッションがないか、セッションがすでに閉じられていません。daoのgetemployeeMethodでセッションを開いたままにしておくと、メモリリークの問題やその他の問題が発生する可能性があると思います。そうですか?また、遅延読み込みと熱心な読み込みを試しました。これらのタイプのフェッチをいつ/どのように使用するかを明確に教えてください。どうすればこれを解決できますか?これを解決するためにフィルターやフェイスリスナーを探すことはできますか?

質問2)従業員のプロジェクトを編集し、session.saveorupadte()、merge()、flush()を使用して更新しようとすると、「同じ識別子を持つオブジェクトはすでにセッションに関連付けられています」というエラーが発生します。どうすればこれを解決できますか?

質問3)sessionfactoryはリソースを消費していることを知っています。したがって、1つのアプリには1つのインスタンスだけで十分です。しかし、セッションはどうですか?アプリのシングルユーザーの場合、必要なセッションは1つだけですか?そのようなアプリを開発するための良い戦略を教えてください。

みなさん、ありがとうございました:)

0 投票する
1 に答える
3673 参照

hibernate - 1 回のトランザクションで複数のテーブルにデータを永続化する

以下のコード スニペットでは、Account と AccountDetails の 2 つのエンティティを保持しようとしています。これをアトミックにしたい。つまり、Account エンティティと AccountDetails エンティティの両方を 1 つのトランザクションで永続化する必要があります。私はそれを達成することができません。

AccountDetails テーブルは、外部キー (account.id) を使用して Account テーブルを参照することに注意してください。

それらを同じトランザクションに保持しようとすると、デッドロックが発生します。そうでなければ、異なるセッションを持つ 2 つの異なるトランザクションが必要です。

質問:

  1. どうすればデッドロックを回避できますか? ここでデッドロックが発生するのはなぜですか?結局、論理的には、 AccountDetailsはAccountを永続化するためにロックする必要はありません。
0 投票する
2 に答える
1653 参照

java - Hibernateセッションでの永続オブジェクトの状態

Hibernateに関しておそらく恥ずかしいほど簡単な質問があります。

オブジェクトの永続化されたインスタンスがあり、これらのオブジェクトのプロパティの一部が同じ内部で変更されている場合Session、それらの変更は私にも表示されますか?

またはrefresh、現在の状態を取得するためにオブジェクトを取得する必要がありますか?


私の質問を拡張したいと思います:これらの変更が同じ内部で行われない場合はどうなりSessionますか?Sessionそれらが同じによって提供されるで作られている場合はどうなりSessionFactoryますか?

0 投票する
1 に答える
181 参照

hibernate - Hibernateセッションで未保存のエンティティのマップを管理するにはどうすればよいですか?

私のエンティティ(myGroup : Group)には、コレクションプロパティ(members : HashMap<Long, GroupMember>)があり、ユーザーが複数の新しい(永続化されていない)GroupMembermyGroup.membersマップに追加できるようにしたいです。

  • コレクションプロパティにハッシュマップを使用している理由は、コレクションの使用が実行可能であることを確認するためです(つまりGroupMember、ビジネスロジックの実行中にIDをすばやく複数回取得できる必要があります)。

  • それらをすぐに永続化したくない理由は、追加の復帰をサポートするためです。ユーザーは、マップを操作し、満足するまでメンバーを追加および削除してから、永続化できる必要がありますmyGroup.members(Hibernateセッションでエンティティを保存してフラッシュする)。

問題は、Hibernateが未保存であることを検出するために新しいGroupMembersにゼロのIDを割り当てる必要があることです。(*)メンバーはマップ内にあり、IDでキー設定されているため、どちらの前にも1つの新しいメンバーしか追加できません。保存または元に戻します。IDがゼロの2番目の新しいメンバーを追加すると、最初のメンバー(への参照)が単純にオーバーライドされます。

私の質問myGroup.membersは、ハッシュマップまたは他のマップ/辞書を使用することのパフォーマンス上の利点を維持しながら、コレクション()への複数の未保存エンティティの追加をサポートするためにコードソリューションをどのように最適に適応させることができるかです。

注:IDがインスタンス内のデータの一意の組み合わせから派生しGroupMember、保存の直前に、Hibernateが永続化する必要があることを検出するために、IDがゼロに設定されるハックをすでに試しましたが、エレガントではなく、私はそれが確実に機能する方法を見つけていません。

*この点に関するHibernateの動作を完全には理解していません。

Group以下のエンティティの省略コード:

0 投票する
1 に答える
82 参照

java - 限られた呼び出しの後にデータベース呼び出しがスリープするのはなぜですか

Q&Aスタイルです。

SessionFactoryUtils.getSessionを使用してセッションを取得し、クエリを実行している間、それは制限されたカウントのみを呼び出すことができ、その制限されたカウントの後に呼び出されるのを待ちます。なぜそれが起こるのですか?

0 投票する
2 に答える
3561 参照

hibernate - GrailswithNewSessionはフラッシュされません

grailsドメインでは、次のように実装されてbeforeDeleteいます

ただし、クライアントショップのnull値はDBに保持されません。

手動セッションフラッシュを追加した場合

それは機能し、クライアントショップの値はデータベースでヌルになります。

これはGrailsのバグですか、それともドキュメントを誤解していますか?withNewSession自動フラッシュを意味しませんか?

0 投票する
1 に答える
198 参照

spring - PROPAGATION_REQUIRED を理解する方法

私はまだ次のことを理解していません:

xxxとの両方finder.findが tx の制御下にあり、伝播が必要ですが、最初の変更のみがデータベースにコミットされることがわかりました。メソッドを削除するfindと、変更はコミットされません。どうしてこれなの?

わかりました、ここに私のコードがあります:

QuestionairService の xxx メソッド:

そして、ここに私の構成があります