CodeGym /Java Course /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