129

新しいプロジェクトで Hibernate を使い続けるか、JPA と新しい Spring Data 実装に慣れるかを決めるのに苦労しています。

Spring Data フレームワークは、大規模なプロジェクトまたは適度なクエリ要件を持つ小規模なプロジェクトを対象としていますか?

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

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

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

私は何をすべきか?Spring Data JPA を使用すると、どのような予期しない複雑さとコストが発生しますか?

4

3 に答える 3

105

そのため、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 サイトで文書化されています。

幸運を。

于 2012-10-09T18:56:08.937 に答える
12

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

複雑なクエリが予測され、JPA なしで Hibernate オブジェクトを快適に使用できる場合は、別の組み合わせとして、単純な Spring DataRepositoryを、必要な特定のメソッドを備えた複雑な Hibernate ベースのオブジェクトの隣に配置することが考えられます。Hibernate 実装を Spring Data JPA 構造にひねる方が面倒ではないかもしれません。

于 2012-10-09T00:50:29.917 に答える