1.1 クラスをテーブルにマッピングする
JDBC を学習した後でも、Java アプリケーションからデータベースを操作するのは依然として楽しいという印象を持つでしょう。この作業はすべて 10 倍簡単に実行できると言ったらどうなるでしょうか?
SQL 言語の主な利点は何ですか? これは宣言型言語です。取得したいものを記述しますが、それを行う方法についてはまったく述べていません。なんと、これが SQL サーバーの問題なのです。
データベースを操作する場合も同じアプローチを使用できます。
理想的な世界では、単純に SQL クエリをデータベースに書き込むことができ、それに応じて、複数の部分をリクエストした場合には、既製の Java オブジェクト、または Java オブジェクトのコレクションを受け取ることができます。
何と言うか、これは 2000 年に何人かの人々が考え、独自の ORM フレームワークを作成することに決めたことです。
ORM はObject-Relational Mappingの略で、本質的には Java オブジェクトを SQL クエリにマッピングします。
彼らは非常に単純なことを思いつきました。それは、データベース内の各テーブルが Java アプリケーション内の何らかのクラスに対応している必要があるということです。Java アプリケーションではオブジェクトを操作しますが、これらのオブジェクトは自身をデータベースに保存する方法をすでに知っています。
この問題を解決するには 3 つのアプローチがあり、次のようになります。
- オブジェクトはそれ自体をデータベースに保存し、データベースからの情報に基づいてそのフィールドを更新します。
- オブジェクトは自身をデータベースに保存できますが、このケースを開始することはありません。
- オブジェクトにはデータのみが含まれており、誰かがそれをデータベースに保存し、データベースからロードします。
当初は、最初のアプローチが主流でしたが、その後、アプリケーション サーバーと Enterprise Java Beans が普及しました。自身をデータベースに保存できる Persistence EJB と呼ばれる Bean のクラス全体もありました。
しかし、ある日を境にすべてが変わってしまった…。
1.2 Hibernateの登場
2001 年に、Hibernate フレームワークの最初のバージョンがリリースされました。これは非常に単純なフレームワークでしたが、データベースにどのように保存するか、そこからロードするかについて何も知らない、通常の「愚かなオブジェクト」の使用を許可していました。
Java クラスのフィールドとデータベース内のテーブルの列のマッピングは、XML ファイルを使用して設定されました。そして、場合によっては非常にかさばる場合もありました。さて、冗談です。それらは XML コードの膨大なキャンバスでした。そしてこの状況は、20 年前には現在のような巨大なデータベースが存在しなかったという事実によってのみ救われました。
しかし実際には、最も強力な決定は、データベースに保存する必要があるオブジェクトを、データベースに保存したコードから最終的に分離することでした。この解決策は実際には明らかではありません。カプセル化の原則により、オブジェクトがどのように保存およびロードされる必要があるかについてはオブジェクトが最もよく知っていると規定されているためです。
そして、ORM アプローチはその概念を本当に打ち破ります。データ クラスは内部構造を公開しますが、さまざまなタイプのオブジェクトのグループを操作するのがはるかに簡単になりました。
Java 5 のリリース後に大きな進歩があり、JDK に次の 2 つのものが登場しました。
- 注釈
- プロキシー
注釈XML はすぐに置き換えられ、Java クラスをデータベース内のテーブルにマッピングするために必要なすべての設定を Java クラス内で簡単に指定できるようになりました。
プロキシーHibernate ユーザーにはそれほど注目されませんでしたが、彼らの貢献はさらに深刻でした。Hibernate から特定のオブジェクトをリクエストすると、Hibernate は単にスタブ (プロキシ) を返し、そのメソッドへのすべての呼び出しをインターセプトします。
これにより、さまざまな Lazy Loading メカニズムの実装が可能になり、Hibernate の速度と効率が当時としては完全に空の高レベルに引き上げられました。Hibernate は事実上の業界標準になっただけでなく、他の言語にも翻訳され始めています。そこで、たとえば C# 向けに Framework NHibernate が登場しました。
1.3 JPAの登場
事実上の承認に続いて法律上の承認。JDK 開発者は、オブジェクトをデータベース内のテーブルに適切にマップする方法に関する仕様を作成することにしました。この仕様はと呼ばれますJPA- Java 永続 API。
まさにこの仕様です。ここでは、すべてがどのように機能するか、また、クラスのオブジェクトをデータベースに保存する場合にクラスのさまざまな部分にどのような注釈を付ける必要があるかを説明します。
彼らは Hibernate をベースにしてパッケージ名を変更しただけのようです。Hibernate にあったすべてのアノテーションがほぼ 1 つずつ JPA に移動されたためです。
現在、Hibernate は JPA 仕様全体に加えて、JPA の操作をさらに快適にするいくつかの追加機能を完全に実装しています。したがって、標準化の観点から、Hibernate には 2 つの機能セットがあると言えます。
- JPA規格
- Hibernate ネイティブ API (追加機能)
Hibernate の公式ドキュメントでは次のように説明されています。
しかし、私の経験と Hibernate ドキュメントを再読した結果に基づいて、JPA と Hibernate API は 95% 同一であると言えます。それらは単なる同一の概念です。
1.4 Hibernate 用の Maven
Hibernate を非常に褒めてきたので、もう少し真剣に取り組んでいく時期が来たと思います。
まず、公式サイトがあり、そこには英語のドキュメントがたくさんあります。もちろん、彼女は参考情報に偏りを持っており、トレーニングには偏りはありません。しかし、ソースをデバッグするよりはまだ良いですよね? :)
命令:
- リンクを開きます。
- あなたは彼女を長い間見つめます。
- CodeGymの話に戻ります。
- 私のさらなる講義を読んでください。
私の仕事は、複雑なことを単純化し、簡単な言葉で説明することです。そして、あなたがこのレベルに達しているなら、私はそれをすることができます。
Hibernate を使い始めるには、それを pom.xml に追加する必要があります。現在までに、Hibernate の第 6 バージョン、つまり 6.1.1 がすでに利用可能になっているため、最新バージョンを使用する方法を学びます。
次の行を pom.xml に追加するだけです。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.1.1.Final</version>
</dependency>
このレクチャーを 2023 年以降の期間外で読んでいる場合は、新しいバージョンをここからダウンロードできます。
重要!Hibernate が使用するライブラリの一部は JDK 11 および JDK 17 で非推奨になっているため、プロジェクトを起動して実行するのに問題がある場合は、次の依存関係をプロジェクトに追加してください。
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.29.0-GA</version>
</dependency>