CodeGym /행동 /All lectures for KO purposes /전체 클래스 계층 구조에 대한 단일 테이블

전체 클래스 계층 구조에 대한 단일 테이블

All lectures for KO purposes
레벨 1, 레슨 862
사용 가능

설명

클래스 계층 구조를 저장하는 다음 접근 방식은 계층 구조의 모든 클래스를 단일 테이블에 저장하는 것 입니다 . 이 전략을 단일 테이블 이라고 합니다 .

예를 들면 다음과 같습니다.

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 규칙.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION