3

誰かがこの特定の質問にすでに回答している場合は事前に申し訳ありませんが、私の問題に対する回答がまだ見つからないため、ここに進みます。

私は、DAO、Hibernate、POJO、およびデータベースへの通信と書き込みにすべてのものを使用するアプリケーションに取り組んでいます(ジョブ用のコードをそのまま提供することはできませんので、申し訳ありません)。これは、Session.flush() を呼び出すときにチェックする大量のデータがないと仮定すると、アプリケーションでうまく機能します。そうは言っても、ユーザーが製品に任意の数のアイテムを追加できるページがあり、25 アイテムのラインに沿って何かがある特定のケースが 1 つあります。各アイテムには、データベースにすべて保存されている約 8 つのフィールドがあります。フラッシュを呼び出すと、すべてがデータベースに保存されますが、完了するまでに永遠にかかります。私が呼んでいる3行は次のとおりです。

merge(myObject);
Session.flush();
Session.refresh(myObject);

この問題を解決するためにさまざまな組み合わせとさまざまな解決策を試しました。うまくいかないようです。私が思いつく唯一の解決策は、プロジェクト全体を破棄するか (控えめに言っても、得られたコードは継承されていて、書き方がまずいものでした)、ユーザー コミュニティにそれを吸うように伝えることです。

Hibernate API から、データをデータベースに書き込みたい場合はすべてのアイテムでチェックを実行し、違いがある場合は更新クエリのキューを作成してからクエリを実行することを理解しています。他の値が変更されていなくても、データベースの「DATE_CREATED」列が異なるため、このデータは毎回更新されているようです。

私が疑問に思っていたのは、そのような大量のデータのコミットを防ぐ別の方法があるか、またはその特定の列を「チェック」休止状態から除外する方法があるかどうかです。変更を加えただけの場合、25 項目すべてをコミットする必要はありません。 1に?

前もって感謝します。

マイク

4

2 に答える 2

2

StatelessSessionを使用しない限り、休止状態でのダーティ チェックを避けることはできません。もちろん、それによって多くの機能 (遅延読み込みなど) が失われますが、この決定を下すのはあなた次第です。

別のオプション:エンティティで間違いなくdynamic-update=trueを使用しようとします。お気に入り:

@Entity(dynamicUpdate = true)
class MyClass

それを使用して、Hibernate は変更された列のみを更新します。列が少ない小さなテーブルではあまり効果的ではありませんが、通常の Hibernate セッションでのダーティ チェックを回避できないため、プロセス全体を高速化するのに役立つ可能性があります。オブジェクト全体ではなく、いくつかの列を更新する方が常に優れていますよね? この投稿では、動的更新属性について詳しく説明しています。

于 2012-08-24T18:00:55.880 に答える