すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for OceanBase:OceanBase データベースへの Hibernate を使用した接続

最終更新日:Jan 19, 2025

このトピックでは、Hibernate 接続の例を示し、いくつかの一般的な機能をテストします。

依存関係の構成

<dependency>
   <groupId>com.oceanbase</groupId>
   <artifactId>oceanbase-client</artifactId>
   <version>2.4.0</version>
</dependency>
<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>5.0.7.Final</version>
</dependency>

hibernate.cfg.xml

ファイルの内容:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!--OceanBase データベース接続情報-->
        <property name="connection.driver_class">com.oceanbase.jdbc.Driver</property>
        <property name="connection.url">jdbc:oceanbase://xxx.xxx.xxx.xxx:3306/test</property>
        <property name="connection.username">a****</property>
        <property name="connection.password">******</property>

        <!-- オプションの構成 -->
        <!-- ダイアレクトをサポートするかどうかを指定します。 -->
        <!-- MySQL モードでは、以下の構成が必要です。 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 作成、読取、更新、削除 (CRUD) 操作の実行時に SQL 文を出力するかどうかを指定します。 -->
        <property name="show_sql">true</property>
        <!--テーブルの自動作成 (変更)-->
        <!--<property name="hbm2ddl.auto">update</property>-->
        <!--<property name="hbm2ddl.auto">create</property>-->

        <!--リソースの登録。(エンティティクラスマッピングファイルのパスを設定します。)-->
        <mapping resource="./UserModel.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

テストの準備

エンティティクラス

public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    // フレームワークに基づいてテーブルが作成された後、テーブルがエンティティクラスの新しいプロパティに従って自動的に変更されることを確認するために、最初にフィールドをコメントアウトします。
    //private String tel;
    //...      コンストラクタと get および set メソッドはここでは省略されています。        
}

XML 形式のエンティティクラスマッピングファイル

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
        'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>
<hibernate-mapping>
    <!-- クラスとテーブル間のマッピングは、class 要素に出力されます。 -->
    <!-- name: 完全なパスを持つクラス名。 -->
    <!-- table: テーブル名。 -->
    <class name="com.alibaba.ob.pojo.User" table="user">
        <!-- プライマリキーのマッピングは、id 要素に出力されます。 -->
        <!-- name: オブジェクト内でプライマリキーとして機能する属性の名前。 -->
        <!-- column: テーブル内のプライマリキーフィールドの名前。 -->
        <!-- name と column の値が同じ場合は、column の値は無視できます。 -->
        <id name="id" column="id">
            <!-- generator 要素の class 属性を "assigned" に設定します。 generator 要素を手動で作成し、クラスに ID を割り当てます。-->
            <generator class="identity"  />

            <!--**Hibernate プライマリキーを生成するための戦略に注意してください。**-->

        </id>
        <!-- 属性とフィールド間のマッピングは、property 要素に出力されます。 -->
        <!-- name: クラス内の属性名。 -->
        <!-- column: テーブル内のフィールド名。 -->
        <!-- name と column の値が同じ場合は、column の値は無視できます。 -->
        <property name="username" />
        <property name="birthday" />
        <property name="sex" />
        <property name="address"/>
       <!--エンティティクラスと同じ-->
    <!--<property name="tel"/>-->
    </class>
</hibernate-mapping>

サンプルコード

接続

@Test
public void testConnection(){
  // 構成情報をロードします。
  Configuration conf = new Configuration().configure();
  // 構成情報に基づいて SessionFactory オブジェクトを作成します。
  SessionFactory sessionFactory = conf.buildSessionFactory();
  // データベースに関連するセッションオブジェクトを開きます。
  Session session = sessionFactory.openSession();
  System.out.println(session);
}

接続が確立されました。

1

テーブルの自動作成

構成ファイルの行コメントを開きます。

2

データベース内の user テーブルを削除した後、次のテスト操作を実行します。

@Test
public void testCreateTableAndInsertData(){
    // テストオブジェクトを作成します。
    User user = new User();
    user.setUsername("hibernateTest");
    user.setSex("Female");
    user.setBirthday(new Date());
    user.setAddress("Beijing");

    //トランザクションを開始します。ここで、文データはセッションに基づいて取得されます。
    Transaction transaction = session.beginTransaction();
    //セッションに基づいてデータを保存します。
    session.save(user);
    //トランザクションをコミットします。
    transaction.commit();
    // 操作が完了したら、セッション接続オブジェクトを閉じます。
    session.close();
}

コンソールで実行された SQL 文と OceanBase データベースでの文の実行結果を表示します。

3

4

テスト結果は、OceanBase データベースが Hibernate のテーブル作成機能をサポートしていることを示しています。

テーブルの変更 (フィールドの追加)

次の例に示すように、構成ファイルを変更します。

<!--テーブルの自動作成 (変更)-->
<property name="hbm2ddl.auto">update</property>
<!--<property name="hbm2ddl.auto">create</property>-->

エンティティクラスと XML ファイルの tel 属性に関するコメントを開き、次のメソッドを実行します。

@Test
public void testAlterTable(){
    // テストオブジェクトを作成します。
    User user = new User();
    user.setUsername("hibernateTest");
    user.setSex("Female");
    user.setBirthday(new Date());
    user.setAddress("Beijing");
    user.setTel("12345678911");

    //トランザクションを開始します。ここで、文データはセッションに基づいて取得されます。
    Transaction transaction = session.beginTransaction();
    //セッションに基づいてデータを保存します。

    session.save(user);
    //トランザクションをコミットします。
    transaction.commit();
    // 操作が完了したら、セッション接続オブジェクトを閉じます。
    session.close();
}

データベースで実行された文と文の実行結果は次のとおりです。

6

7

元のテーブルに基づいて、フレームワークはエンティティクラスと XML ファイルに基づいてテーブルにフィールドを自動的に追加します。

テスト結果は、OceanBase データベースが Hibernate のテーブル変更機能をサポートしていることを示しています。

データの永続化

テストメソッド:

@Test
public void testInsert() {
    User u1 = new User("asd", new Date(), "Male", "Zhangzhou");
    User u2 = new User("qwe", new Date(), "Female", "Hangzhou");
    User u3 = new User("zxc", new Date(), "Male", "Shanghai");
    User u4 = new User("xcv", new Date(), "Female", "Hangzhou");
    User u5 = new User("sdf", new Date(), "Male", "Hangzhou");
    User u6 = new User("wer", new Date(), "Female", "Hangzhou");
    User u7 = new User("ert", new Date(), "Male", "Zhangzhou");
    User u8 = new User("rty", new Date(), "Female", "Shanghai");
    User u9 = new User("tyu", new Date(), "Male", "Hangzhou");
    ArrayList<User> users = new ArrayList<>();
    users.add(u1);
    users.add(u2);
    users.add(u3);
    users.add(u4);
    users.add(u5);
    users.add(u6);
    users.add(u7);
    users.add(u8);
    users.add(u9);
    //トランザクションを開始します。ここで、文データはセッションに基づいて取得されます。
    Transaction transaction = session.beginTransaction();
    //セッションに基づいてデータを保存します。
    for (User user : users) {
        session.save(user);
    }
    //トランザクションをコミットします。
    transaction.commit();
    // 操作が完了したら、セッション接続オブジェクトを閉じます。
    session.close();
}

実行結果:

8

テスト結果は、OceanBase データベースが Hibernate の挿入機能とプライマリキーの自動インクリメント機能をサポートしていることを示しています。

HQL モードと SQL モードでのクエリ

テストメソッド:

@Test
public void testQuery() {
    //SQL モード
    //SQLQuery query = sessionFactory.openSession().createSQLQuery("select * from user where sex = 'Male'").addEntity(User.class);
    //HQL モード
    //Query query = sessionFactory.openSession().createQuery("select User from User User where User.sex = 'Male'");
    List<User> list = query.list();
    list.forEach(System.out::println);
}

実行結果:

SQL モード:

9

HQL モード:

10

テスト結果は、OceanBase データベースが Hibernate のクエリ機能をサポートしていることを示しています。

更新

テストメソッド

@Test
public void testChange(){
    User user = (User) session.createSQLQuery("select * from user where id = 1").addEntity(User.class).list().get(0);
    System.out.println("変更前: "+user);
    user.setAddress("Hangzhou");
    session.update(user);
    user = (User) session.createSQLQuery("select * from user where id = 1").addEntity(User.class).list().get(0);
    System.out.println("変更後: "+user);
}

実行結果:

11

テスト結果は、OceanBase データベースが Hibernate の更新機能をサポートしていることを示しています。

削除

テストメソッド:

@Test
public void testDelete(){
    Transaction transaction = session.beginTransaction();
    List<User> list = session.createSQLQuery("select * from user").addEntity(User.class).list();
    System.out.println(list);
    int i = session.createSQLQuery("delete from user where id = " + list.get(0).getId()).executeUpdate();
    list = session.createSQLQuery("select * from user").addEntity(User.class).list();
    System.out.println(list);
    //トランザクションをコミットします。
    transaction.commit();
    // 操作が完了したら、セッション接続オブジェクトを閉じます。
    session.close();
}

実行結果:

12

テスト結果は、OceanBase データベースが Hibernate の削除機能をサポートしていることを示しています。