JPAはじめに
導入以前、JPA JPA ORMの仕様はJDK5の日に組み込まれ、そのオブジェクトのORM統合技術、標準化と規格です。HibernateEntityManagerのJBossのを含め、より成熟したJPAのフレームワークでは、OracleはコミュニティのEclipseLinkのEclipse、ApacheのOpenJPAのなどに寄贈しました。HibernateはJPAを記述するために、次の例を使用します。
利用休止のEntityManager
Hibernateは、ばね自体とは無関係である、とSpringフレームワークを使用することなく、コードのダオ層は、以下の標準的な所要時間図示persistence.xml
プロファイル
パブリッククラスUserDaoImplは実装UserDao { 公共accountInfoの保存(accountInfoのaccountInfoのを){ てEntityManagerFactory EMF = 永続.createEntityManagerFactory("SimplePUを"); EntityManagerのEM = EMF .createEntityManager(); EM .getTransaction().begin(); EM .persist(accountInfoの); EM .getTransaction().commit(); EMFの.close(); accountInfoのを返します。}}
春+休止状態を使用します
春のプロジェクトで導入された場合は、JPAのための春は、最も重要なのは創造と破壊、トランザクション管理などのEntityManagerの春で、設定はより柔軟で、非常にフレンドリーなサポートが自動的にではなく、手動で新しい実装クラスを注入するために使用することができます提供しますコードは、その一元管理することによって抽出されます。トランザクション管理とのEntityManagerは、作成するすべてのコードの開発者は、もはや気にする必要はありません破壊します。
永続コード:
@Repository("userDao ") のパブリッククラスUserDaoImplが実装UserDao { @PersistenceContext プライベートのEntityManager emから。@Transactional 公共のロング保存(accountInfoのaccountInfoの){EM .persist(accountInfoの); accountInfoの返却.getAccountIdを(); }}
プロファイル:
<?XMLのバージョン= "1.0 " エンコード= "UTF-8 ?"> < 豆...> < コンテキスト:コンポーネント・スキャンベースパッケージ= "footmark.springdata.jpa " /> < TX :注釈駆動型トランザクションマネージャ= "のTransactionManager " /> < ビーンID = "のTransactionManager " クラス= "org.springframework.orm.jpa.JpaTransactionManager "> < プロパティ名= "のEntityManagerFactory " REF = "のEntityManagerFactory " />"てEntityManagerFactory " クラス= "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean "> </ 豆> </ 豆>
テストコード:
パブリッククラスSimpleSpringJpaDemo {
公共静的ボイドメイン(文字列[] 引数){ ClassPathXmlApplicationContext CTX = 新しいClassPathXmlApplicationContext("バネデモ-cfg.xmlを")。UserDao userDao = CTX .getBean("userDao "、UserDaoの.classファイル); userDao .createNewAccount("ZhangJianPing "、"123456 "、1); }}
春データJPAを使用して
トップからは、春のJPAサポートは非常に強力なされている見ることができ、開発者が作成のみ、トランザクション処理のJPAのEntityManagerプロセスに関連するあまり気にせずに、コアビジネスロジックの実装コードを心配する必要があります。しかし、あなたは、DAO永続層の実装ロジックを見つけるか、手動で書き込みをします。それによって生じるSpring Data JPA
、スプリングデータJPA永続性層は、自動的に継承することによって提供される所望の論理仕様または標準インタフェースを達成するために、メソッド名に応じて生成することができRepository
、PagingAndSortingRepository
、CrudRepository
およびJpaRepository
他の種々の方法は、実質的に自動的に取得、または注釈によってCRUD @Query
カスタムいくつかの複雑な実装。
特に春データ-JPA休止状態に依存。
バックグラウンドで春データJPAは、プロキシオブジェクトを作成するための永続化層界面で、機能層の持続的な達成するための3つの方法があります。
- 標準インタフェースを継承することにより、基本的なCRUDメソッドへのアクセス
- カスタム形式のメソッドは、指定された名前、自動的にその機能に従って命名春データJPAに準拠しています。
- 声明上記の方法を使用して
@Query
プロキシオブジェクトを作成するときに、引数、春データJPAとして、クエリは、その機能注釈を満たすために提供し、クエリを提供します。または増加@Modifying
クエリを変更するために、注釈は、クエリ(更新操作)を識別する
標準またはカスタムインタフェースは、メソッドを継承します
以下のためにRepository
、PagingAndSortingRepository
、CrudRepository
およびJpaRepository
永続層によって開発された他のインターフェースの時間を選択する方法である必要があり、直接の後継者CrudRepository
またはPagingAndSortingRepository
これらのインターフェイスはもちろん、自動的に多くのことを達成したのは非常に簡単ですが、これは問題を提示し、それはあなたがビジネスに公開したくないさらされる可能性が方法層。たとえば、あなただけ削除する方法を提供することが望まずに動作して増加し、特定のインターフェイスが提供します。このような状況に鑑みて、開発者はリポジトリのインターフェースに戻ることができ、その後、もちろん、ありませんので、特定の一般的なシンプルなシステム(ERP)、方法について、カスタマイズすることができCrudRepository方法宣言をインターフェースを維持したいコピーしますどのように簡単に来ます。
次のように春データJPAは、カスタムクエリのためのいくつかのキーワードクエリ式の条件を提供しています。
- そして--- SQLおよびキーワードに相当し、このようfindByUsernameAndPassword(文字列のユーザー、StriangのPWD)など;
- あるいは---そのようなfindByUsernameOrAddress(文字列のユーザは、文字列ADDR)のような、SQLのと同等またはキーワード。
- BETWEEN --- SQLのキーワードの間に相当なfindBySalaryBetween(int型の最大値、整数分)。
- LessThan --- "<"、などfindBySalaryLessThan(int型の最大)のSQLに相当;
- 演算子:GreaterThan ---のSQL同等物 ">"、例えばfindBySalaryGreaterThan(INT分)。
- IsNull --- SQLに相当する "nullである" は、findByUsernameIsNull()。
- IsNotNull --- SQL当量)(例えばfindByUsernameIsNotNull、 "nullでありません"。
- NOTNULL ---とIsNotNull相当。
- 「のような」のような--- SQL相当、などfindByUsernameLike(文字列のユーザー)。
- NotLike ---におけるSQLに相当するようなfindByUsernameNotLike(文字列のユーザ)として、「好きではありません」。
- [並べ替え---そのようなfindByUsernameOrderBySalaryAsc(Stringユーザー)として「順」にSQLに相当。
- 「!=」などfindByUsernameNot(文字列のユーザー)として、SQLへ---同じではありません。
- ---「の」、例えばfindByUsernameIn(コレクションユーザーリスト)へのSQL同等の、パラメータタイプ収集方法があってもよい、または配列可変長パラメータであってもよいです。
- Notin ---「NOT IN」のSQL等価物、例えばfindByUsernameNotIn(コレクションユーザーリスト)は、パラメータタイプ収集方法であってもよい、または配列可変長パラメータであってもよいです。
@queryを使用してクエリを作成します。
非常に簡単に使用する@queryノートは、単にJP QLクエリを提供しながらすることができ、メソッド宣言上記のコメントをマーク
パブリックインターフェースUserDaoは延びリポジトリ< accountInfoの、ロング> { @query("?a.accountId = 1 accountInfoのaから選択")accountInfoのfindByAccountId(ロングaccountIdをします)。@query("a.balance> 1 accountInfoのaから選択?")ページ< accountInfoの> findByBalanceGreaterThan(整数バランス、ページング可能ページング可能)。}
開発者は、この目的のために、@queryを使用して、更新操作を行うことができ、我々は、クエリを変更する操作を識別するために@Modifyingで@queryを使用する必要があります
@Modifying
@query("?更新組accountInfoのa.salary = 1 a.salary <2?") INT increaseSalary(INT後、INT前)。
少し特殊な文言を削除します。
@Transactional
int型deleteByCountrycode(@Param("国番号")文字列の国番号);
springboot統合Spring Data JPA
:公式の春データJPAスターターの統合springboot spring-boot-starter-data-jpa
統合に依存している、Hibernate
、Spring Data JPA
だけでなく、Spring ORMs
(SpringフレームワークからコアORMのサポート )。使用することは非常にシンプル。
まず、依存関係を追加
< 依存性
<のgroupId> org.springframework.boot </ のgroupId>
< たartifactId>ばねブートスタータデータJPA </ たartifactId> </ 依存>
二つには、コンフィギュレーションをapplication.properties
spring.datasource.url = JDBCます。mysql:// localhostを:3306 /テスト
spring.datasource.username =ルート
spring.datasource.password =ルート
spring.datasource.driverクラス名=はcom.mysql.jdbc.Driverの 春。 jpa.properties.hibernate.hbm2ddl.auto =作成・ドロップ
第三に、エンティティを作成
@Entity
パブリッククラスユーザー{ @Id @GeneratedValue プライベートロングID。@Column(NULL可能= false)のプライベート文字列名; @Column(NULL可能= false)をプライベート整数歳。//省略构造函数//省略ゲッター和セッター}
第四に、データ・アクセス・インタフェースを作成します
パブリックインターフェースUserRepositoryは延びJpaRepository < ユーザ、ロング> { ユーザーfindByName(文字列名)。ユーザーfindByNameAndAge(文字列名、整数の年齢)。@query("ユーザからU u.name =名")ユーザfindUser(@Param("名前")文字列名)。}
githubのは、 H2-メモリデータベースを使用してデモを注意し、参照することができる具体的なデモプロジェクトの実装を持っています。
取引のための春のデータJPAサポート
デフォルトでは、法春データJPAの実装では、トランザクションを使用しています。@Transactional(読み取り専用=真)に相当するクエリタイプのための方法、; CRUD型方法は、@Transactionalと等価です。図から分かるように、クエリの方法に加えて、取引読み取り専用に設定され、他のトランザクション属性はデフォルト値です。
もちろん、外取引注釈永続化層を使用することに加えて、開発者は、トランザクションがビジネス層のメソッドは、永続化メソッドを複数回の場合を求めて主にビジネス層の方法で属性を指定@Transactional使用することができます。トランザクションは、永続層を決定するトランザクションセットの伝播に応じて層を追加して、保留中の取引またはビジネス業務の層です。
Baiduの検索を使用する場合は、一度再生した、唯一のGoogle検索を参照して、見つから関連する記事はありません。
:この記事はに再現されhttps://github.com/jiwenxing/spring-boot-demo/wiki/Spring-Data-JPA