本記事では、Hibernateを使用した接続例を紹介し、いくつかの一般的な機能をテストします。
依存関係の設定
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</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.mysql.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://t5******.********.oceanbase.cloud:3306/test</property>
<property name="connection.username">admin</property>
<property name="connection.password">******</property>
<!-- オプション設定 -->
<!--方言をサポートするかどうか、以下のMySQLModeとOracleModeはデータベースモードに応じて設定します-->
<!--MySQLMode-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!--OracleMode-->
<property name="dialect">org.hibernate.dialect.Oracle12cDialect</property>
<!--CURD実行時に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:オブジェクト内で主キーとして使用される属性名 -->
<!-- colomn:テーブル内の主キーフィールド名 -->
<!-- nameとcolumnの値が同じ場合、columnは省略できます -->
<id name="id" column="id">
<!-- generator要素のclass属性を"assigned"に設定すると、手動で生成されます。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 session = sessionFactory.openSession();
System.out.println(session);
}
接続が正常に確立されました:

自動テーブル作成
設定ファイルのこの行のコメントを解除します:
<—-自動テーブル作成(テーブルの変更)-->
<!--<property name="hbm2ddl.auto">update</property>-->
<!--<property name="hbm2ddl.auto">create‹/property>-->
データベース内のuserテーブルを削除した後、以下のテストメソッドを実行します:
@Test
public void testCreateTableAndInsertData(){
//テスト対象を作成する
User user = new User();
user.setUsername("hibernateTest");
user.setSex("女");
user.setBirthday(new Date());
user.setAddress("北京");
//トランザクションを開始します。セッションから取得します。
Transaction transaction = session.beginTransaction();
//セッションを通じてデータを保存します。
session.save(user);
//トランザクションをコミットします。
transaction.commit();
//操作が完了したら、セッション接続オブジェクトを閉じます。
session.close();
}
コンソールに出力された実行されたSQLステートメントとOceanBaseデータベース内の結果を確認します:
Hibernate: drop table if exists user
Hibernate: create table user (id integer not null auto_increment, username varchar (255), birthday datetime, sex varchar (255), address varchar (255), primary key (id))
Hibernate: insert into user (username, birthday, sex, address) values (?, ?, ?, ?)
Process finished with exit code
obclient> drop table user;
Query OK, 0 rows affected
obclient› select * from user;
+----+---------------+-----------------------+------+---------+
| id | username | birthday | sex | address |
+----+---------------+-----------------------+------+---------+
| 1 | hibernateTest | 2020-09-17 17:22:32 | 女 | 北京 |
+----+---------------+-----------------------+------+---------+
結果から、OceanBaseはHibernateのCREATE TABLE機能を適切にサポートしていることがわかります。
テーブルの変更(フィールドの追加)
まず、設定ファイルを以下のように変更します:
<—-自動テーブル作成(テーブル変更)-->
<!--<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("女");
user.setBirthday(new Date());
user.setAddress("北京");
user.setTel("12345678911");
//トランザクションを開始、sessionから取得
Transaction transaction = session.beginTransaction();
//sessionを通じてデータを保存
session.save(user);
//トランザクションをコミット
transaction.commit();
//操作完了、session接続オブジェクトを閉じる
session.close();
}
実行ステートメントおよびデータベースの結果は以下のとおりです:
Hibernate: insert into user (username, birthday, sex, address, tel) values (?, ?, ?, ?, ?)
Process finished with exit code
obclient› select * from user;
+----+---------------+-----------------------+------+---------+
| id | username | birthday | sex | address |
+----+---------------+-----------------------+------+---------+
| 1 | hibernateTest | 2020-09-17 17:30:39 | 女 | 北京 |
+----+---------------+-----------------------+------+---------+
1 row in set
obclient› select * from user;
+----+---------------+-----------------------+------+---------+---------------+
| id | username | birthday | sex | address | tel |
+----+---------------+-----------------------+------+---------+---------------+
| 1 | hibernateTest | 2020-09-17 17:30:39 | 女 | 北京 | NULL |
| 2 | hibernateTest | 2020-09-17 17:31:27 | 女 | 北京 | 123456789111 |
+----+---------------+-----------------------+------+---------+---------------+
2 row in set
既存のテーブルに対して、フレームワークはエンティティクラスおよびXMLファイルに基づき、自動的にテーブルに新しい列を追加しました。
結果から見ると、OceanBaseはHibernateのalter table機能を適切にサポートしています。
データの永続化
テスト方法:
@Test
public void testInsert() {
User u1 = new User("asd", new Date(), "男", "漳州");
User u2 = new User("qwe", new Date(), "女", "杭州");
User u3 = new User("zxc", new Date(), "男", "上海");
User u4 = new User("xcv", new Date(), "女", "杭州");
User u5 = new User("sdf", new Date(), "男", "杭州");
User u6 = new User("wer", new Date(), "女", "杭州");
User u7 = new User("ert", new Date(), "男", "漳州");
User u8 = new User("rty", new Date(), "女", "上海");
User u9 = new User("tyu", new Date(), "男", "杭州");
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);
//トランザクションを開始します。sessionから取得します。
Transaction transaction = session.beginTransaction();
//sessionを通じてデータを保存します。
for (User user : users) {
session.save(user);
}
//トランザクションをコミットします。
transaction.commit();
//操作完了後、session接続オブジェクトを閉じます。
session.close();
}
実行結果は次のとおりです:
obclient› select * from user;
+----+---------------+-----------------------+------+---------+---------------+
| id | username | birthday | sex | address | tel |
+----+---------------+-----------------------+------+---------+---------------+
| 1 | hibernateTest | 2020-09-17 17:30:39 | 女 | 北京 | NULL |
| 2 | hibernateTest | 2020-09-17 17:31:27 | 女 | 北京 | 123456789111 |
| 3 | asd | 2020-09-17 18:05:17 | 男 | 漳州 | NULL |
| 4 | qwe | 2020-09-17 18:05:17 | 女 | 杭州 | NULL |
| 5 | zxc | 2020-09-17 18:05:17 | 男 | 上海 | NULL |
| 6 | xcv | 2020-09-17 18:05:17 | 女 | 杭州 | NULL |
| 7 | sdf | 2020-09-17 18:05:17 | 男 | 杭州 | NULL |
| 8 | wer | 2020-09-17 18:05:17 | 女 | 杭州 | NULL |
| 9 | ert | 2020-09-17 18:05:17 | 男 | 漳州 | NULL |
| 10 | rty | 2020-09-17 18:05:17 | 女 | 上海 | NULL |
| 11 | tyu | 2020-09-17 18:05:17 | 男 | 杭州 | NULL |
+----+---------------+-----------------------+------+---------+---------------+
結果から見ると、OceanBaseはHibernateのInsert機能を良好にサポートしており、Hibernateの自動インクリメント主キー生成戦略もサポートしています。
HQLモードとSQLモードでのクエリ
テスト方法:
@Test
public void testQuery() {
//SQLモード
//SQLQuery query = sessionFactory.openSession().createSQLQuery("select * from user where sex = '男'").addEntity(User.class);
//HQLモード
//Query query = sessionFactory.openSession().createQuery("select User from User User where User.sex = '男'");
List<User> list = query.list();
list.forEach(System.out::println);
}
実行結果は以下のとおりです:
SQLモード:

HQLモード:

結果から見ると、OceanBaseはHibernateのQuery機能を良好にサポートしています。
変更操作
テスト方法:
@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("杭州");
session.update(user);
user = (User) session.createSQLQuery("select * from user where id = 1").addEntity(User.class).list().get(0);
System.out.println("変更後:"+user);
}
実行結果は次のとおりです:

結果から判断するに、OceanBaseはHibernateのUPDATE機能を適切にサポートしています。
削除操作
テスト方法:
@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接続オブジェクトを閉じます。
session.close();
}
実行結果は次のとおりです:

結果から判断するに、OceanBaseはHibernateのDELETE機能を適切にサポートしています。