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
와 결합한 다음 필터링해야 하기 때문입니다.
GO TO FULL VERSION