0

私が取り組んでいるプロジェクトでは、インポート/エクスポート機能を追加しています。これは問題なく動作しています。

私が今やろうとしているのは、ユーザーが実際に何かをする前にインポートをテストし、レポートを返すことを可能にする「dryRun」と呼ばれるオプションを持つことです。

だから、私のセットアップは次のとおりです。

  1. Spring MVCを介してインポートデータを取得する(OpenSessionInViewを使用)
  2. これをドメインクラス(実際にマップされた休止状態クラス)に逆シリアル化します
  3. すべてをスキャンして、参照などに問題がないことを確認します。
  4. 私のすべてのサービスには@Transactionalがあります

これはほとんど問題ありませんが、どこかで保存がトリガーされ(保存を呼び出すことはありません)、グループ化オブジェクトが一時的な参照について文句を言っています。保存されていないため、これは正しいです。これはある種の種類だと思います。グループ化オブジェクトがマップされている別のオブジェクトを参照しているため、デフォルトモードのhibernateにはあります。では、hibernateが何も保存しないようにするにはどうすればよいですか。@TransactionalとOpenSessionInViewを削除せずに(通常の場合に必要です)

何か案は?

よろしく、モーテン

4

2 に答える 2

2

Hibernateは変更をエンティティに暗黙的に保存します。これは永続性の無知の一部であり、実際には非常に重要です。(この質問を参照してください。)フラッシュモードを[しない]に設定することでオフにできますが、通常はお勧めしません。インポートコードにクエリがある場合、それらはメモリの変更を考慮せず、異なる結果を返します(ドライランの目的を破壊する可能性があります)。

オプション:

  • 実装を維持し、最後にすべてをロールバックします。これは、データベース内の何かを同時に変更したくない場合にのみ機能します(たとえば、ドライランが発生したログ)。
  • フラッシュモードを設定=​​しないで、「保存」と「更新」の呼び出しを避けます。それは一種のハッキーです。
  • ドライランアウトに重要なすべてのものを、エンティティを変更せず、このエンティティのみを実行する検証クラスにプルします。これは最も複雑ですが、最もクリーンなソリューションでもあります。
于 2012-05-16T08:22:36.847 に答える
2

あなたは言う

どこか..保存がトリガーされます

その「どこか」は、例外を除いて取得するスタックトレースにあります。

[編集]スタックトレースは基本的に「メソッドMetaDataController.importXml()は@Transactionalで注釈が付けられています」と言っています。戻ると、Hibernateはトランザクションを適切にコミットしようとします。その後、の未保存の依存関係に遭遇します(もちろん、 Hibernateもこれを知っているので、どのフィールドOrganisationUnitGroupに依存関係が含まれているのかを示すとよいでしょう)。

いくつかの解決策があります:

  1. インポートする2つのメソッドを作成します。新しいものには、注釈を付け.importXmlDryRun()てはなりません。@Transactionalそれはうまくいくかもしれませんが、今は名前を付けることができませんが、私の腸の感覚は問題について私に警告します。

  2. .importXml()ドライランが要求されたときにトランザクションを中止するために例外をスローし、デフォルトのハンドラーでこの例外を無視します。例外により、Hibernateはロールバックします。これが最も安全なソリューションです。

  3. Hibernateセッションを取得し、clear()docs)を呼び出します

于 2012-05-16T08:36:23.637 に答える