説明

クラス階層を格納する次のアプローチは、階層内のすべてのクラスを 1 つのテーブルに格納することです。この戦略は単一テーブルと呼ばれます。

たとえば、次のようになります。

CREATE TABLE user_ employee_client {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE,
  address VARCHAR,
  DTYPE VARCHAR
}

つまり、階層のすべてのクラスの列が異なる色でマークされている 1 つのテーブルがあります。特別なサービス列DTYPE VARCHARもあり、Hibernate はそこに Entity クラスの名前を保存します。

あとは、Entity クラスのデータがデータベース内の 1 つのテーブルに保存されていることを Hibernate に説明することだけです。これは@Inheritanceアノテーションを使用して行うことができます。

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

私たちのクラスの例:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}
@Entity
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
class Client extends User {
   String address;
}

データの保存方法

次に、いくつかのエンティティを作成してデータベースに保存する例を書いてみましょう。

Employee employee = new Employee();
employee.id = 101;
employee.name = "Ivanov";
employee.birthday = LocalDate.of("01-01-1999");
employee.occupation = "Programmer"
employee.salary = 100000;
employee.join = LocalDate.of("12-01-2018");
session.persist(employee);

Client client = new Client();
client.id = 102;
client.name = "Petrov";
client.birthday = LocalDate.of("15-11-1988");
client.address = "Shandara";
session.persist(client);

データベースに保存すると、次の SQL クエリが実行されます。

INSERT INTO user_ employee_client (id, name, birthday, occupation, salary, join, DTYPE)
VALUES (101, 'Ivanov', '01-01-1999', 'Programmer', 100000, '12-01-2018', 'Employee')

INSERT INTO user_ employee_client (id, name, birthday, address, DTYPE)
VALUES (102, 'Petrov', '15-11-1988', 'Shandara', 'Client')

データをテーブルに保存するとき、Hibernate は既知のエンティティ フィールドのみを渡します。これは、指定されていない列は NULL になることを意味します。

これは、クライアントが同じテーブルに格納されると、その職業が NULL になるため、職業列に型 NOT NULL を指定できないことを意味します。これは、異なるエンティティを同じテーブルに格納する場合の欠点の 1 つです。

SQL クエリの最後のフィールドは DTYPE 列で、これにはエンティティ クラスの名前が含まれます。これは、テーブルからデータを読み取るときに Hibernate によって使用されます。

例:

List<User> accounts = session.createQuery("from User").list();

このクエリは、データベースに保存されているすべてのユーザー タイプのオブジェクト (ユーザー、従業員、クライアント) のリストを返します。DTYPE 列に基づいて、エンティティ タイプが正しく決定され、正しいクラスのオブジェクトが作成されます。

この場合、アカウント リストには、従業員タイプとクライアント タイプの 2 つのオブジェクトが存在します。

HQL ルール。