보존 문제
오늘 우리는 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에 데이터베이스 쿼리를 작성하고 사용자, 직원, 고객 등 모든 사용자 목록을 가져올 수 없습니다.
GO TO FULL VERSION