8

クラスの 90% が非常に単純で、DB で 1 対 1 で簡単にマッピングできるドメインがあります。Hibernate と spring-data-jpa を組み合わせることで、これらのクラスの多くの雑用が削減されたことを非常に嬉しく思います。

ただし、ドメインの残りの部分は難しく、さまざまな理由から、DB テーブルに直接マップしたくありません。

Hibernate によって管理される中間 Bean を導入し、これらの Bean からドメインにマップする実験を行いました。これは、すべての関係が難しい部分から簡単な部分までの場合にうまく機能しました。このアプローチは、Hibernate によって管理される「簡単な」クラスがあり、カスタム Java コードにマップされ、休止状態で直接管理されない「挑戦的な」クラスを参照している場合に失敗します。

これは、Hibernate をカスタマイズし、オンザフライでそのような変換を行うことを可能にするある種の ObjectFactory をプラグインする方法が見つからないことに気付いたときです。

- 編集 -

私の質問は何ですか: JPA を使用しているときに、エンティティに DB の問題がない DDD スタイルのドメイン層を持つ最も簡単な方法は何ですか? DDD では、すべての DB の問題は、通常 DAO と連携するリポジトリによって処理されます。

エンティティに DB の問題がないということは、ドメイン クラスに JPA アノテーションやマッピング構成がないことを意味します。これを行う 1 つの方法は、ドメイン エンティティにマップされた TO を JPA (または他の永続化テクノロジ) で管理することです。ただし、このルートを使用する場合、すべてのエンティティが必要であり、最も単純なもの (アドレスを考えてください) でさえ、マッピング レイヤーを経由します。

些細なエンティティにJPAのような「怠惰な」ものを使用し、それらを「手動で」管理される他のエンティティと混合できるようにしたいと思います。現在、JPA管理エンティティから非JPA管理エンティティへのリンクを可能にする巧妙なソリューションを知りません。いつでも JPA エンティティを取得してから、2 回目の呼び出しで非 JPA エンティティを取得できますが、可能であればこれを避けたいと考えています。

4

2 に答える 2

8

JPAとjOOQを組み合わせることができます。JPA/Hibernate はデータの書き込みに最適です。

  • すべてのエンティティ列は INSERT/UPDATE に含まれているため、新しい列を追加するときに保存ルーチンを変更する必要はありません
  • 暗黙的/明示的な楽観的/悲観的ロックの両方の広範なサポート
  • 最適化された識別子ジェネレーターのサポート (pooled-lo オプティマイザー)
  • ロックの競合を減らすためのトランザクショナル ライトビハインド キャッシュ (MVCC DB でも)
  • JDBC fetching は 1 つの構成で完了

SQL と jOOQ は、データの読み取りに最適であり、特に SQL-92 JPA Dialect の抽象化を超えたい場合に最適です。ネイティブ クエリ (およびタイプ セーフな jOOQ) を使用すると、データベースが提供するすべての機能を利用できます。

  • ウィンドウ関数
  • ピボット
  • 派生テーブル
  • 共通テーブル式と再帰クエリ
  • マージ
  • 一括挿入/更新

最終的には、JPA クエリとネイティブ クエリの両方が必要になる可能性が高いため、現在のデータベースを最大限に活用しながらコンパイル時の安全性を保証するには、jOOQ が最適です。

于 2015-02-15T22:40:05.223 に答える
0

データベースで 1:1 表現を持たないクラスをマップできますが、マッピングの作業が増えるだけです。純粋な POJO が必要な場合は、Hibernates xml マッピングを使用します。ほとんどの複雑なデータベース スキーマはマッピング可能であり、SO についてはすでに多くの質問があります。各クラスと対応するデータベース テーブル/ビュー/関数について質問を投稿してください。回答が見つかります。

于 2012-11-28T07:53:15.987 に答える