[解決済み] Spring Data JPAとHibernateは大規模プロジェクトではどう違うのか?
質問
新しいプロジェクトで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サイト .
がんばってください。
関連
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
Java の double データ型における 0.0 と -0.0 の問題
-
ApiModel と @ApiModelProperty の使用法
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み】HibernateとSpring Data JPAの違いは何ですか?
-
[解決済み] Spring Data JPAにカスタムメソッドを追加する方法
-
[解決済み] Spring Dataのリポジトリをテストするには?
-
[解決済み] JPAとSpring Data JPAの違いは何ですか?
-
[解決済み] Spring Data JPA GROUP BY クエリからカスタムオブジェクトを返す方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NullPointerException - java.lang.
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
アクセス制限です。タイプ 'Application' は API ではない(必要なライブラリに制限がある)。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
Jsoup-Crawlingの動作
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
Junitのユニットテストエラー
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ