CodeGym /행동 /All lectures for KO purposes /엔티티 계층 작업

엔티티 계층 작업

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

보존 문제

오늘 우리는 Hibernate 기능을 사용하여 클래스 계층 구조를 데이터베이스에 저장하는 새롭고 매우 흥미로운 계획을 갖게 될 것입니다.

클래스 계층 구조는 상속 관계에 의해 서로 관련된 클래스 집합입니다.

데이터베이스에 저장하려는 세 가지 클래스가 있다고 상상해 보십시오.

class User {
  int id;
  String name;
  LocalDate birthday;
}
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
class Client extends User {
   String address;
}

클래스는 서로 상속됩니다. 그리고 가장 흥미로운 점은 이러한 클래스의 객체를 데이터베이스에 저장하기 위해 Hibernate를 사용하기를 원한다는 것입니다.

솔루션 유형

Hibernate에는 클래스 계층 구조를 데이터베이스의 테이블과 연결할 수 있는 4가지 가능한 방법이 있습니다.

  • 매핑된 슈퍼클래스
  • 싱글 테이블
  • 조인된 테이블
  • 클래스별 테이블

각 전략은 데이터베이스에서 고유한 테이블 구조를 가정합니다. 때때로 그들은 매우 복잡합니다. 그러나 HQL에 대한 쿼리는 매우 간단합니다. 바로 하이버네이트의 장점이 확연히 드러나는 경우다.

나는 이 용어들이 러시아어로 번역된 것을 들어본 적이 없으므로 영어로 발음하는 것도 추천합니다.

아래에서는 각각의 의미를 분석합니다.

@MappedSuperClass

가장 간단한 솔루션부터 시작하겠습니다. 데이터베이스에는 각 클래스에 대한 별도의 테이블이 있습니다 . 예를 들어 다음과 같습니다.

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
}

이러한 테이블의 클래스가 계층 구조로 연결되어 있다는 것은 사용자만 알 수 있습니다 . Hibernate가 이것에 대해서도 알고 싶다면 부모 클래스에 @MappedSuperclass 주석을 추가해야 합니다 . 그것 없이는 Hibernate는 단순히 부모 클래스의 필드와 주석을 무시할 것입니다.

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

@MappedSuperclass
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;
}

이것은 클래스 계층 구조와 데이터베이스를 연결하는 가장 원시적인 방법입니다. 이 접근 방식은 실제로 클래스에서 중복 필드를 피할 수만 있습니다.

HQL의 데이터베이스 쿼리는 유형이 명시적으로 지정된 항목만 반환합니다. HQL에 데이터베이스 쿼리를 작성하고 사용자, 직원, 고객 등 모든 사용자 목록을 가져올 수 없습니다.

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