1. ホーム
  2. java

[解決済み] Spring Data JPAとHibernateは大規模プロジェクトではどう違うのか?

2022-07-14 21:02:42

質問

新しいプロジェクトでHibernateにこだわるべきか、JPAと新しいSpring Dataの実装に足を踏み入れるべきか、判断に迷っているところです。

Spring Dataフレームワークは大規模プロジェクト向けなのか、それとも控えめなクエリ要件を持つ小規模プロジェクト向けなのか?

確かに、Spring Dataフレームワークを使うことでコードを削減できる利点はありますが @Query アノテーションを使用することによるコード削減の利点は確かに理解できますが、動的なクエリの場合はどうするのでしょうか?かなり複雑な save() メソッドを実装したい場合はどうでしょうか?

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

このフレームワークが複雑で大規模なアプリケーションの課題に対応できるかどうかは、非常に不確かです。私はHibernateで多くの問題に遭遇したことがなく、Spring Data 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 を拡張していることに注意してください。

@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サイト .

がんばってください。