3.1 Hibernate とデータベースのリンク

Maven を使用して Hibernate をアプリケーションに接続する方法と、アノテーションを使用してテーブルをクラスにマップする方法を学びました。そして次の疑問が生じます - どのようにしてデータベースからオブジェクトを読み取るか、データベースにオブジェクトを保存するのでしょうか?

そんなに早くない。まず、さらに 3 つのことに対処する必要があります。

  • データベース接続の構成
  • 休止状態のセットアップ
  • EntityManager の操作

Hibernate はデータベースの操作をアプリケーションから完全に隠しますが、過剰な作業を避けるためには正しく設定する必要があります。この段階をスキップすることはできません。そうでない場合、Hibernate はどのデータベースにオブジェクトを保存するかをどのようにして知るのでしょうか?

Hibernate は 3 つの方法で構成し、データベース情報を提供できます。

  • プロパティファイルを使用する
  • hibernate.cfg.xml ファイルを使用する
  • 構成 Bean メソッドを使用する

私は最後のものが最も気に入っていますが、間違いなく 3 つすべてに遭遇することになるため、ここでは 3 つすべてを分析します。

3.2 データベースでの認可

最も重要なデータベース接続から始めましょう。これを行うには、Hibernate が目的のデータベースにログインできるようにデータを提供する必要があります。

プロパティファイルの構成
hibernate.properties
hibernate.dialect= org.hibernate.dialect.Oracle9Dialect
hibernate.connection.driver_class= oracle.jdbc.driver.OracleDriver
hibernate.connection.url= jdbc:oracle:thin:@localhost:1521:supershop
hibernate.connection.username=root
hibernate.connection.password=secret
hibernate.show_sql=true
hibernate.hbm2ddl=update

同じ設定を XML ファイルの形式で設定できます。

XML ベースの構成
hibernate.cfg.xml
<hibernate-configuration>
	<session-factory>

    	<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
    	<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    	<property name="connection.url">jdbc:oracle:thin:@localhost:1521:supershop</property>
    	<property name="connection.username">root</property>
    	<property name="connection.password">secret</property>
    	<property name="hibernate.show_sql ">true</property>
    	<property name="hbm2ddl.auto">update</property>

	</session-factory>
</hibernate-configuration>

どちらの例でも、同じ設定が同じ値で表示されています。最初の例ではそれらをプロパティ ファイルとして表し、2 番目の例ではXML ファイルとして表しているだけです。

これらの設定は 3 つのグループに分類されます。

  1. DBMSの種類を指定します
    • 方言 (DBMS タイプ) を指定します (例: Oracle 9.0)。
    • この DBMS を操作するための JDBC ドライバーの名前を指定します
  2. データベースに認証用のデータを指定します
    • データベースのURL
    • ユーザー名
    • パスワード
  3. Hibernate エンジンの構成
    • hibernate.show_sql- Hibernate は、実行するすべてのリクエストをコンソールに複製します。
    • hbm2ddl.auto- Hibernate は必要に応じてデータベース構造を変更します。

構成を設定する 3 番目の方法は、ビンを使用することです。通常、Spring と組み合わせて使用​​されるため、SpringFramework を学習するときに見ていきます。

3.3 SessionFactoryの取得

次のステップは、SessionFactory オブジェクトを取得することです。これを行うにはいくつかの方法があります。

1 つ目の方法は、hibernate.properties ファイルを使用することです。

これを行うには、次のコードを記述するだけです。

SessionFactory sessionFactory = new Configuration().buildSessionFactory();

hibernate.properties ファイルが現在のプロジェクト ディレクトリに見つからない場合は、例外がスローされます。

2 番目の方法は、hibernate.cfg.xml を使用した構成です。

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

このようなコードを作成すると、hibernate.cfg.xml. そのようなファイルが見つからない場合、メソッドはbuildSessionFactory()例外をスローします。

3 番目の方法は、構成ファイルを手動で設定することです。

開発プロセス中に、テスト ベースに切り替えたり、ベースを操作するための他の設定を変更したりすることが必要になる場合があります。このために、構成ファイルを手動で設定できます。

SessionFactory sessionFactory = new Configuration().configure("hibernate-dev.cfg.xml").buildSessionFactory();

方法 4 -カスタムの hibernate.properties ファイルを使用します。

ClassLoader classLoader = Thread.currentThread().getClassLoader();

Properties properties = new Properties();
properties.load(classLoader.getResourceAsStream("hibernate-dev.properties"));

SessionFactory sessionFactory = new Configuration()
            .addProperties(properties)
            .buildSessionFactory();

最後に、必要なパラメータをすべてコードに直接縫い込むことができます。

Properties properties = new Properties();
properties.put(Environment.DRIVER, "com.mysql.jdbc.Driver");
properties.put(Environment.URL, "jdbc:mysql://localhost:3306/supershop");
properties.put(Environment.USER, "root");
properties.put(Environment.PASS, "password");

SessionFactory sessionFactory = new Configuration()
            .setProperties(properties)
            .buildSessionFactory();

3.4 エンティティクラスを探す場所を指定する

しかし、それだけではありません。Hibernate でSessionFactoryオブジェクトを設定すると、このSessionFactory は、必要な列タイプを持つ必要なテーブルがすべてデータベースに存在することを確認します。

SessionFactory がこれを実行できるようにするには、データベースにマップする必要があるエンティティ クラスのリストを渡す必要があります。

エンティティ クラスのリストを渡すには 3 つの方法があります。

方法 1。hibernate.cfg.xml次のような行を追加します。

<mapping class="class-qualified-name" />

例:

<mapping class="com.codegym.data.User" />
<mapping class="com.codegym.data.Employee" />
<mapping class="com.codegym.data.Task" />

方法 2。Configurationオブジェクトのメソッドを呼び出しますaddAnnotatedClass()。例:

SessionFactory sessionFactory = new Configuration()
   	.configure()
   	.addAnnotatedClass(com.codegym.data.User.class)
   	.buildSessionFactory();

クラスが多数ある場合は、それらをパッケージ全体に追加できます。

SessionFactory sessionFactory = new Configuration()
   	.configure()
   	.addPackage("com.codegym.data")
   	.buildSessionFactory();

3.5 最後の例

SessionFactory オブジェクトの構成方法を学習したので、それを使用するコードを作成しましょう。

これは 3 つの方法で構成されます。

  1. 休止状態の構成
  2. データベースから全従業員を取得するメソッド
  3. 新しい従業員をデータベースに保存するメソッド

このコード テンプレートは次のようになります。

class EmployeeManager {
    private SessionFactory sessionFactory;

    public void class init() {
    	this.sessionFactory = new Configuration()
        	.configure()
        	.buildSessionFactory();
   }

   public List<Employee> getAllEmployes() {
         try (Session session = sessionFactory.openSession()) {
  	          Query<Employee> query = session.createQuery("from Employee", Employee.class);
    	        return query.list();
         }
   }

   public void addEmployee(Employee employee ) {
     	try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
       	    session.save(employee);
            transaction.commit();
     	}
   }
}

データベースに対してクエリを実行する前に、別のセッションを作成する必要があります。リクエストが関連している場合は、同じセッションで実行できます。リクエストに関連性​​がない場合 (リクエスト間に数分が経過する可能性がある場合)、独自のセッションを作成する必要があります。

データベースからデータを読み取る場合、または複雑なクエリを実行する場合は、まず Query オブジェクトを作成し、それを使用してクエリを実行する必要があります。

また、データベースへの各クエリは独自のトランザクションで実行されます。これを開いて必要な操作を実行してから閉じる (コミット) 必要があります。

次の講義では、これがどのように機能するかをより詳細に分析します。