5.1 설명

마지막으로 마지막 전략은 클래스별 테이블입니다. 이는 각 클래스에 대해 별도의 테이블이 사용됨을 의미합니다. 어떤 의미에서 이것은 업데이트된 형식에서만 동일한 MappedSuperClass입니다.

먼저 주석을 사용해야 합니다.

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

이 주석이 있는 클래스는 다음과 같습니다.


@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@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;
}

그리고 각 클래스에 대한 별도의 테이블. 예를 들어 다음과 같습니다.


CREATE TABLE user {
	id INT,
	name VARCHAR,
	birthday DATE
}

CREATE TABLE employee {
	id INT,
	name VARCHAR,
	birthday DATE,
	occupation VARCHAR,
	salary INT,
	join DATE
}

CREATE TABLE client {
	id INT,
	name VARCHAR,
	birthday DATE,
	address VARCHAR
}

주요 차이점은 통과 ID(PRIMARY KEY)가 모든 테이블에 사용된다는 것입니다. 동일한 테이블 내에서뿐만 아니라 이 테이블 그룹 내에서도 동일한 ID를 가진 다른 행을 가질 수 없습니다. Hibernate가 이것을 처리할 것이다.

5.2 예

모든 것이 어떻게 작동하는지 보는 것은 매우 흥미 롭습니다.

간단한 HQL 쿼리를 작성하여 모든 사용자( User, Employee, Client) 를 가져올 수 있습니다 .

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

그러나 Hibernate는 매우 흥미로운 쿼리를 생성할 것입니다. 모든 테이블에서 선택한 다음 UNION ALL을 통해 일종의 가상 테이블로 결합한 다음에만 검색 및/또는 선택합니다.

그러나 서로 다른 열이 있는 테이블을 병합하려면 먼저 가짜 열로 보완해야 합니다. 예를 들어 사용자 테이블은 열로 보완되어야 합니다.

  • occupation VARCHAR
  • salary INT
  • join DATE
  • address VARCHAR

실행 전 사용자 테이블 에 대한 SQL 쿼리의 예 UNION ALL:


SELECT   id,
         name,
         birthday,
         CAST(NULL AS VARCHAR) AS occupation,
         CAST(NULL AS INT) AS salary,
         CAST(NULL AS DATE) AS join,
         CAST(NULL AS VARCHAR) AS address,
         0 AS clazz
FROM  user

실행 전 직원 테이블 에 대한 예제 SQL 쿼리 UNION ALL:


SELECT   id,
         name,
         birthday,
         occupation,
         salary,
         join,
         CAST(NULL AS VARCHAR) AS address,
         1 AS clazz
FROM  employee

실행 전 클라이언트 테이블 에 대한 SQL 쿼리의 예 UNION ALL:


SELECT  id,
        name,
        birthday,
        CAST(NULL AS VARCHAR) AS occupation,
        CAST(NULL AS INT) AS salary,
        CAST(NULL AS DATE) AS join,
        address,
        2 AS clazz
FROM client

좋은 소식은 HQL 쿼리가 원하는 방식으로 작동한다는 것입니다.

나쁜 소식은 테이블에 데이터가 많으면 속도가 느려질 수 있다는 것입니다. 먼저 모든 테이블에서 데이터를 선택한 다음 해당 행을 UNION ALL와 결합한 다음 필터링해야 하기 때문입니다.