Spring Data JPAは、大規模プロジェクトのHibernateとどう違うのですか?


129

新しいプロジェクトでHibernateを使い続けるべきか、それともJPAと新しいSpring Dataの実装で足を踏み入れるべきかを判断するのに苦労しています。

Spring Dataフレームワークは、大規模なプロジェクトを対象としていますか?

@Query注釈を使用することによるコード削減の利点は確かにわかりますが、動的クエリに対して何をしますか?非常に複雑なsave()メソッドを実装する場合はどうでしょうか?

ドキュメントには、メインリポジトリが実装するカスタムインターフェイスと実装を作成するように記載されていますが、クラッドリポジトリ自体のスーパーメソッドにアクセスする必要がある場合はどうでしょうか。crudリポジトリはカスタムのリポジトリを実装します-逆ではありません。奇妙なデザインのようです。

このフレームワークが複雑で大規模なアプリケーションの課題に対応できるかどうかは非常に不確かです。私はHibernateで多くの問題に遭遇したことがなく、Spring Data JPAを使用するのではなく、古き良き信頼性を維持することを検討しています。

私は何をすべきか?Spring Data JPAを使用すると、予期せぬ複雑さとコストが発生しますか?


1
私の知る限り、ほとんど違いはありません。使いやすい方を選びましょう。なぜ議論するのですか?
duffymo 2012年

1
私は明らかにHibernateの方がずっと快適ですが、同じことを実行して生産性を高めることができる場合は、新しいアプローチを採用したいと思います。ただし、Hibernateがさらに強力で、問題がはるかに少ない場合は、それについて知りたいと思います。
egervari 2012年

3
JPAは、多くの実装の1つとしてHibernateを使用するORMの一般化です。あなたは他の何よりもあなたにどのような力を帰しているのですか?JPAは標準ですが、2つの違いはほとんどありません。完全な開示のために、どちらも気にしません。どちらもSQLを生成します。自分で書いたほうがいいです。ORMはすべての問題とすべてのユーザーのためのものではありません。
duffymo 2012年

1
同意する。JPAまたはHibernateのみになると、毎回Hibernateを選択します。正直に言って、それだけではJPAの実装はあまり好きではありません。IDEAでのIDEのサポートは実際にはまだ悪い状態であり、ユニットテストを実行するのではなく、アプリケーションの起動時にマッピングが正しくない場合に不満を示します。JPAには他にもたくさんのつまらないものがあります。古いHibernate XMLマッピングファイルを実際に楽しんでいます。これには、オブジェクトが散らかりにくくなるという利点もあります。Spring Data JPAは多くの新機能を提供しているので、切り替える価値があるのか​​と私はようやく疑問に思いました。
egervari 2012年

3
「Spring Data」はJPAの実装などではありません。それは単に既存のJPA実装を採用し、それに提供するものを単純化します。JPAの実装は、すべての作業
Neil Stockton

回答:


104

したがって、spring-data複雑なクエリに役立つ追加の魔法を実行します。最初は奇妙で、ドキュメントでは完全にスキップしますが、それは本当に強力で便利です。

これには、カスタムRepositoryとカスタムの `RepositoryImpl ' を作成し、Springにそれを見つける場所を指示することが含まれます。次に例を示します。

構成クラス- リポジトリパッケージをポイントするアノテーションを使用して、まだ必要なxml構成をポイントします*Implクラスを自動的に検索します)。

@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}

jpa-repositories.xml-リポジトリのSpring場所を教えてください。またSpring、次のCustomImplファイル名のカスタムリポジトリを探すように指示します。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<jpa:repositories base-package="com.example.repositories" repository-impl-postfix="CustomImpl" />

</beans>

MyObjectRepository-ここに、注釈付きおよび注釈なしのクエリメソッドを配置できます。このリポジトリインターフェースがどのように拡張するかに注意してくださいCustom

@Transactional
public interface MyObjectRepository extends JpaRepository<MyObject, Integer>, MyObjectRepositoryCustom {

    List<MyObject> findByName(String name);

    @Query("select * from my_object where name = ?0 or middle_name = ?0")
    List<MyObject> findByFirstNameOrMiddleName(String name);
}

MyObjectRepositoryCustom -より複雑で単純なクエリや注釈では処理できないリポジトリメソッド:

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}

MyObjectRepositoryCustomImpl-autowiredを使用してこれらのメソッドを実際に実装する場合EntityManager

public class MyObjectRepositoryCustomImpl implements MyObjectRepositoryCustom {

    @Autowired
    private EntityManager entityManager;

    public final List<MyObject> findByNameWithWeirdOrdering(String name) {
        Query query = query(where("name").is(name));
        query.sort().on("whatever", Order.ASC);
        return entityManager.find(query, MyObject.class);
    }
}

驚くべきことに、これはすべて一緒になり、両方のインターフェース(および実装したCRUDインターフェース)からのメソッドはすべて、次のときに表示されます。

myObjectRepository.

表示されます:

myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()

それは本当に機能します。そして、クエリ用のインターフェースを1つ取得します。spring-data本当に大きなアプリケーションの準備ができています。さらに、シンプルなクエリやアノテーションにプッシュできるクエリが多いほど、効果が上がります。

これらすべては、Spring Data Jpaサイトで文書化されています

幸運を。


4
これは実際に私が試したものであり、ある程度機能します。私が抱えていた問題は、save()をオーバーライドしたい場合はどうなりますか?たとえば、ブログを保存していて、それに関連付けられているタグをsave()メソッドで処理/保存したいとします。サービスにブログを配置することはあまり意味がありません。これは生のHibernateを使用して簡単に実行できますが、Spring JPAを使用する良い方法はありません。正解なので、正解としてマークします。基本的には、Spring Data JPAでできることです。私はHibernateに固執すると思います。この答えは間違いなく他の人を助けるでしょう。
egervari 2012年

8
独自のJpaRepository->を実装できますMyJpaRepository。また、作成するMyJpaRepositoryFactoryBean必要がありますが、すべてを正しく設定した場合は、.save()メソッドをオーバーライドできます。これがSpring Data JPAドキュメントです:static.springsource.org/spring-data/data-jpa/docs/current/…まだあきらめないでください!
sbzoom

@Picrochole「アプリケーションの下層」をどのように解釈しますか?DAOを呼び出すサービスはTierの下位にありますか?
ルミット

12

私は、Spring Data JPAを、単純なクエリ要求を伴う大小のプロジェクトで使用しました。主な利点は、@Query注釈を使用する必要がないことです。Spring Dataには、大規模なプロジェクトでの使用を妨げるものはなく、最近のQueryDSLサポートが役立つ場合があります。これは、QueryDSLを使用してHibernateをターゲットにする例です。

複雑なクエリを予測していて、JPAなしでHibernateオブジェクトを使い慣れている場合は、代替の組み合わせRepositoryとして、必要な特定のメソッドを備えた複雑なHibernateベースのクエリの隣に単純なSpring Dataを配置することもできます。Hibernate実装をSpring Data JPA構造にねじ込むことは、それほど面倒ではありません。


2
同じプロジェクトで混合して一致させるのではなく、クエリに同じ一貫性のあるAPIを使用したいと思います。私はまだ複雑な春のデータのjpaに関する適切な解決策を見つけていません。また、一般的に持っているjpaのニッチがかなりあるので、休止状態を自分のormとして受け入れるほうが幸せだと思うのです。複雑なクエリがたくさんあるので、40/60の混合は許されません。それは私には価値がありません:(
egervari

1
Spring Dataなしで直接Querydslを使用して、JPAの上に単一の強力なクエリレイヤーを提供することもできます。
TimoWestkämper、2012年

4

Spring JPAは、SQLの記述や、クエリメソッド宣言を使用したHQLの記述から多くの抽象化を提供します。Spring JPAはクエリ生成で優れていますが、Spring JPAは依然として休止状態に基づいているため、純粋に休止状態のソリューションが必要な場合は、必要に応じてカスタマイズできます。詳細については、ドキュメントhttp://static.springsource.org/spring-data/data-jpa/docs/current/reference/htmlを確認してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.