新しいプロジェクトのためにHibernateを使用するか、JPAと新しいSpring Data実装で足を踏み入れるかを決めるのに苦労しています。
Spring Dataフレームワークは、大規模なプロジェクトまたは適度なクエリ要件を持つ小さなプロジェクト向けですか?
私は確かに@Query
アノテーションを使用することでコード削減の利点を見ていますが、動的クエリに対して何をしますか?非常に複雑なsave()メソッドをいつ実装したいのでしょうか?
ドキュメントには、メインリポジトリが実装するカスタムインターフェイスと実装を作成するように記載されていますが、crudリポジトリ自体のスーパーメソッドにアクセスする必要がある場合はどうでしょうか。 crudリポジトリは、カスタムリポジトリを実装します-逆ではありません。奇妙なデザインのようです。
このフレームワークが複雑で大規模なアプリケーションの課題を満たすかどうかは非常に不確かです。 Hibernateで多くの問題に遭遇したことはありません。SpringData JPAではなく、古き良き信頼性を維持することを検討しています。
私は何をすべきか? Spring Data JPAを使用する場合、どのような予想外の合併症や費用が発生しますか?
したがって、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サイト で文書化されています。
幸運を。
Spring Data JPAは、単純なクエリ要求のある小規模および大規模プロジェクトで使用しました。主な利点は、@Query
アノテーションを使用する必要がないことです。 Spring Dataには、大規模プロジェクトでの使用を妨げるものは何もありません。最近のQueryDSL
supportが役立つかもしれません。 これは例ですQueryDSL を使用してHibernateをターゲットにします。
複雑なクエリを予見し、JPAを使用せずにHibernateオブジェクトを使用することに不安がある場合、別の組み合わせとして、必要な特定のメソッドを備えた複雑なHibernateベースのデータの隣に単純なSpring Data Repository
sを置くことができます。 Hibernate実装をSpring Data JPA構造にねじ込む方が面倒ではないかもしれません。
Spring JPAは、SQLおよびクエリメソッド宣言を使用したHQLの記述から多くの抽象化を提供します。 Spring JPAはクエリの生成に優れていますが、純粋に休止状態のソリューションが必要な場合、spring JPAはまだ休止状態に基づいているため、必要に応じてカスタマイズできます。詳細については、ドキュメントを確認してください http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html .