์„ค๋ช…

ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋‹ค์Œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ๋‹จ์ผ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค . ์ด ์ „๋žต์„ ๋‹จ์ผ ํ…Œ์ด๋ธ” ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค .

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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 ๊ทœ์น™.