web-dev-qa-db-ja.com

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

新しいプロジェクトのためにHibernateを使用するか、JPAと新しいSpring Data実装で足を踏み入れるかを決めるのに苦労しています。

Spring Dataフレームワークは、大規模なプロジェクトまたは適度なクエリ要件を持つ小さなプロジェクト向けですか?

私は確かに@Queryアノテーションを使用することでコード削減の利点を見ていますが、動的クエリに対して何をしますか?非常に複雑なsave()メソッドをいつ実装したいのでしょうか?

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

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

私は何をすべきか? Spring Data JPAを使用する場合、どのような予想外の合併症や費用が発生しますか?

127
egervari

したがって、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 oneをどのように拡張するかに注意してください。

@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-自動配線された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サイト で文書化されています。

幸運を。

102
sbzoom

Spring Data JPAは、単純なクエリ要求のある小規模および大規模プロジェクトで使用しました。主な利点は、@Queryアノテーションを使用する必要がないことです。 Spring Dataには、大規模プロジェクトでの使用を妨げるものは何もありません。最近のQueryDSLsupportが役立つかもしれません。 これは例ですQueryDSL を使用してHibernateをターゲットにします。

複雑なクエリを予見し、JPAを使用せずにHibernateオブジェクトを使用することに不安がある場合、別の組み合わせとして、必要な特定のメソッドを備えた複雑なHibernateベースのデータの隣に単純なSpring Data Repositorysを置くことができます。 Hibernate実装をSpring Data JPA構造にねじ込む方が面倒ではないかもしれません。

11
madth3

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

4
F.O.O