설명
클래스 계층 구조를 저장하는 다음 접근 방식은 계층 구조의 모든 클래스를 단일 테이블에 저장하는 것 입니다 . 이 전략을 단일 테이블 이라고 합니다 .
예를 들면 다음과 같습니다.
CREATE TABLE user_ employee_client {
id INT,
name VARCHAR,
birthday DATE,
occupation VARCHAR,
salary INT,
join DATE,
address VARCHAR,
DTYPE VARCHAR
}
즉, 계층 구조의 모든 클래스에 대한 열이 다른 색상으로 표시되는 하나의 테이블이 있습니다. Hibernate가 Entity 클래스의 이름을 저장할 특수 서비스 열 DTYPE VARCHAR 도 있습니다 .
이제 Entity 클래스의 데이터가 하나의 테이블에 데이터베이스에 저장되어 있음을 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 유형을 지정할 수 없음을 의미합니다. 이는 동일한 테이블에 서로 다른 엔터티를 저장하는 단점 중 하나입니다.
SQL 쿼리의 마지막 필드는 Entity 클래스의 이름을 포함하는 DTYPE 열입니다. 테이블에서 데이터를 읽으려고 할 때 Hibernate에서 사용합니다.
예:
List<User> accounts = session.createQuery("from User").list();
이 쿼리는 데이터베이스에 저장된 모든 사용자 유형 개체(User, Employee 및 Client)의 목록을 반환합니다. DTYPE 열을 기반으로 엔터티 유형이 올바르게 결정되고 올바른 클래스의 개체가 생성됩니다.
우리의 경우 계정 목록에는 Employee 유형과 Client 유형의 두 개체가 있습니다.
HQL 규칙.
GO TO FULL VERSION