大規模プロジェクトの場合、Spring Data JPA と Hibernate の違いは何ですか? 質問する

大規模プロジェクトの場合、Spring Data JPA と Hibernate の違いは何ですか? 質問する

新しいプロジェクトでは Hibernate を使い続けるべきか、それとも JPA と新しい Spring Data 実装を試してみようか、決めるのに苦労しています。

Spring Data フレームワークは、大規模なプロジェクト向けですか、それともクエリ要件がそれほど厳しくない小規模なプロジェクト向けですか?

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

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

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

どうすればいいでしょうか? Spring Data JPA を使用すると、どのような予期しない問題やコストが発生しますか?

ベストアンサー1

つまり、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 サイト

おすすめ記事