CodeGym /행동 /SQL & Hibernate /엔티티 계층 작업

엔티티 계층 작업

SQL & Hibernate
레벨 15 , 레슨 0
사용 가능

보존 문제

오늘 우리는 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