2012-10-08 9 views
108

私は、新しいプロジェクトのためにHibernateに固執しなければならないか、JPAと新しいSpring Dataの実装で自分の足元を濡らすべきかどうかを決定するのに苦労しています。Spring Data JPAは大きなプロジェクトでHibernateとどのように異なるのですか?

大量のプロジェクトや小規模なプロジェクトには、妥当なクエリ要件がありますか?

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

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

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

どうすればよいですか? Spring Data JPAを使用すると予期せぬ複雑さとコストが発生しますか?

+1

私が知る限り、それはほとんど違いがありません。あなたがより快適なものを持って行きなさい。なぜ議論? – duffymo

+1

私は明らかにHibernateの方が快適ですが、同じことをして生産性を上げることができれば、より新しいアプローチを採用したいと思います。しかし、Hibernateがさらに強力で問題が少なくなる場合、それは私が知りたいことです。 – egervari

+2

JPAは、多くの実装の1つとしてHibernateを使用するORMの一般化です。あなたはどんな力を相手に与えているのですか? JPAは標準ですが、私は2つの違いはほとんどありません。完全な開示のために、私はどちらかを気にしないと言います。どちらもSQLを生成します。私はむしろそれを自分で書くだろう。 ORMはすべての問題とすべてのユーザーのためのものではありません。 – duffymo

答えて

91

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

これはカスタムRepositoryとカスタムの `RepositoryImpl 'を作成し、Springにどこにそれを見つけるかを伝えます。次に例を示します。

Configurationクラス - あなたのリポジトリのパッケージを指して注釈を使用して、まだ、必要なXML設定からポイント(それが自動的に今*Implクラスを検索する):

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

JPA-リポジトリ.xml - Springにリポジトリの場所を教えてください。またCustomImplファイル名を指定して、カスタム・リポジトリを探すためにSpringを伝える:

<?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 1を拡張する方法注:

@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 siteに記載されています。

幸運。

+4

これは実際に試したもので、ある程度は機能します。たとえば、あなたがブログを保存していて、それをサービスに入れてもsave()メソッドに関連付けられたタグを処理/保存したいと思っても、saveほとんどの意味でこれはraw Hibernateでは簡単ですが、Spring JPAとは良いやり方は見当たりません。正しいものだから正しい答えを記入します。これは基本的にSpringでできることです – egervari

+8

あなた自身の 'JpaRepository' - >' MyJpaRepository'を実装することができます。あなたは 'MyJpaRepositoryFactoryBean'も作成しなければなりませんが、すべて設定すれば正しく設定すると、.sa ve()メソッド。 Spring Data JPA Docsは次のとおりです。http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories Do not giveまだまだ! – sbzoom

+0

@Picrochole「アプリケーションの下位層」はどのように解釈されますか?サービスはDAOをより低いレベルに呼びますか? – Rumid

9

私はSpring Data JPAを簡単なクエリの要求を伴う大規模プロジェクトに使用しました。主な利点は、@Queryアノテーションを使用する必要がないことからです。 Spring Dataには大きなプロジェクトでの使用を妨げるものは何もなく、最近のQueryDSLサポートが役立つかもしれません。 HibernateをターゲットにするためにQueryDSLを使用しているThis is an example

複雑なクエリが予想され、JPAなしでHibernateオブジェクトを使用するのが快適であれば、複雑なHibernateベースの単純なSpringデータのほうが望ましいかもしれません。 Hibernate実装をSpring Data JPA構造体にねじ込むことは、それほど面倒ではないかもしれません。

+2

同じプロジェクトでミキシングとマッチングを行うのではなく、同じ一貫性のあるAPIをクエリに使用したいと思います。私はまだ複雑なスプリングデータのための良い解決策を見つけていないし、私が一般的に持っているjpaを持つかなりのニックピックがあるので、私はちょうど私のオームとして冬眠を受け入れるほうが幸せかもしれないと思う。私は複雑なクエリがたくさんありますが、私は40/60の混合を持つ余裕がありません。 ( – egervari

+1

)Spring Dataを使わずにQuerydslを直接使用することもできます。JPAの上に1つの強力なクエリレイヤーを提供します。 –

2

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

関連する問題