web-dev-qa-db-ja.com

JPAとSpring JdbcTemplate

新しいプロジェクトでは、JPAは常にリレーショナルデータを処理するための推奨ツールですか、それともSpring JdbcTemplateの方が適しているシナリオがありますか?あなたの応答で考慮すべきいくつかの要因:

  • 新しいデータベーススキーマと既存のスキーマおよびテーブル
  • 開発者の専門知識のレベル
  • データキャッシングレイヤーと統合できる容易さ
  • 性能
  • 考慮すべき他の関連要因はありますか?
67
aem999

ドメインモデルを介してデータベーススキーマにアクセスしたくない場合は、Spring JdbcTemplateを使用します。 JdbcTemplateを使用すると、より低いレベルのアクセスが使用され、柔軟性が増しますが、おそらく定型文も増えます。

Spring JdbcTemplateは、エキゾチックなデータベーススキーマとストアドプロシージャフォーカスでより簡単に使用できます。 JPAを使用して、データベーススキーマがドメインモデルに正しくマップされることを確認する必要があります。

どちらのテクノロジーにも、リレーショナルデータベース、SQL、およびトランザクションを知っている開発者が必要です。ただし、JPAを使用すると、隠れた複雑さが増します。

私の知る限り、JPAはデータキャッシングレイヤーに簡単にプラグインできます。オブジェクト指向のフォーカスにより、キャッシュエントリの識別、更新、無効化が容易になるためです。

JdbcTemplateベースのバックエンドをさらに微調整できますが、ほとんどの場合、より多くのコードが関与します。

考慮すべき他の側面は、JPAではデータベーススキーマのドメインモデルを取得しますが、多くの場合、追加のDTOクラスを使用する必要があることです。 JdbcTemplateを使用すると、DTOクラスを直接操作できます。

119

この投稿には少し遅れていますが、ORMではなくJdbcTemplateを使用する傾向があります。私はSQLをよく知っているので、DBから「抽象化」されたくありません。ほとんどの場合、私のアプリは、ほとんどのビジネスロジックをプッシュするDBビューを使用しています。 JdbcTemplateを実装したDAOを適切に階層化しています。 「きれい」に感じられ、ほとんどの定型コードはJdbcTemplateによって隠されています(そして、オンラインドキュメントはORMのものよりもはるかに優れているようです)。 Hibernateのようなものを使用した限られた時間は、それが動作したときに、時間を節約できることがわかりました...しかし、適切に動作しなかった場合、「WTF」デバッグに何日もかかりました。 JdbcTemplate DAO implsのデバッグに20分以上費やす必要はありませんでした。他の人が指摘したように、キーはあなたがSQL/Schema Designにどれだけ慣れているかだと思います

66
Jason

@Timoに同意します。私が追加/拡張する唯一の洞察は、ORMがデータへの純粋なSQLアクセスとは異なるセマンティクスを持っているということです。

ORMのポイントは、データがDBにあるという事実を可能な限り抽象化することです。 ORMを適切に使用すると、すべての永続化操作が1つの(できれば)薄いレイヤーで処理されます。モデルオブジェクトには、永続化コードがほとんどまたはまったくありません。 ORMを使用しているという事実はモデルから見えないはずです。

このため、ORMは、特定のタイプの操作、つまり単純なCRUD操作を簡単に行えるようにするのに非常に優れています。モデルオブジェクトをロード、表示、更新、削除することが非常に簡単です。データにアクセスすると、モデルオブジェクトが返され、そこにビジネスロジックを記述できるため、生活が楽になります。 JDBCを使用する場合、データからオブジェクトインスタンスを「ハイドレート」する必要がありますが、これは複雑でエラーが発生しやすくなります。

ORMは常に最良の選択とは限りません。 JPAはジョブのツールです。ツールがジョブに十分でない場合、より良いツールを見つけたいと思うでしょう。たとえば、オブジェクトグラフ全体をコピーし、それらのオブジェクトの新しいコピーを保存する必要があるシナリオがありました。 ORMを使用していた場合(やろうとして)、DBからすべてのオブジェクトをロードし、それらをコピーして、新しいオブジェクトを保存する必要がありました。時間がかかりすぎた。

より良い解決策は、単にjdbcベースの操作と「select via insert」sql呼び出しを使用して新しい行を作成することでした。それは高速で、コードはよりシンプルでした。

もう1つ考慮すべき点は、JDBCに慣れていて期限があり、ORMの時流に乗る必要がないことです。 Spring JdbcTemplateクラスは非常に強力で便利です。時々、仕事に最適なツールはあなたが知っているものです。 ORMに慣れる必要がありますが、必ずしも高い期待を持つプロジェクトには必要ありません。学ぶべきことがたくさんありますが、それは簡単なことではありません。実際、jdbc vs ormを使用するという選択において、ある複雑なセットを別の複雑なセットと交換しています。

40
hvgotcodes

他の回答には記載されていませんが、両方を使用しても構いません。私のアプリではJPAとJdbcTemplateを使用し、crudタイプの操作にはJPAを使用しますが、レポート作成またはそれが簡単な場合はjdbcTemplateを使用します。

@Repository
public class FooRepository
{
    @PersistenceContext
    private EntityManager entityManager;

    @Autowired(required = true)
    private JdbcTemplate jdbcTemplate;

    public void saveFoo(Foo foo)
    {
         this.entityManager.persist(foo);
    }

    public List<SomeReportPojo> getSomeReport()
    {
         return this.entityManager.queryForList("SELECT .. ",SomeProjectPojo.class); 
    }
}

Springの素晴らしい点は、JPA例外からspring Dao例外階層への例外変換がJPAとjdbcTemplateの両方で機能することです。したがって、意味がある場合はJPAを使用し、意味がある場合はjdbcTemplateを使用します。

29
ams

職場では柔軟性が高いため、Hibernate JDBCTemplateを使用します。また、多くの不要なデータをアプリに「ロード」していないため、JPAよりもパフォーマンスが優れています。
JDBCTemplateの場合、SQLスキルは、必要なものを適切な速度で正確に提供するのに役立ちます。

4
user3131171