JavaRush /Курстар /All lectures for KK purposes /Бүкіл класс иерархиясы үшін бірыңғай кесте

Бүкіл класс иерархиясы үшін бірыңғай кесте

All lectures for KK purposes
Деңгей , Сабақ
Қол жетімді

Сипаттама

Класс иерархиясын сақтау келесі тәсілі – бұл барлық иерархия класстарын бір кестеде сақтау. Мұндай стратегия Single Table деп аталады.

Мысалы, осылай:


CREATE TABLE user_ employee_client {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE,
  address VARCHAR,
  DTYPE VARCHAR
}

Яғни бізде бір кесте бар, онда иерархиямыздағы барлық класстар үшін бағандар әртүрлі түстермен белгіленген. Сондай-ақ, арнайы қызметтік DTYPE VARCHAR бағаны бар, мұнда Hibernate Entity-класстың атауын сақтайды.

Аз қалды – Hibernate-ке Entity-кластардың деректері қазір бір кестеде сақталатынын түсіндіру керек. Мұны @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;
}

Деректер қалай сақталады

Енді мысал жазайық, онда бірнеше Entity жасап, оларды базаға сақтайық:


// Пайдалану алдында класс аттарын қысқартпай жазыңыз
Employee employee = new Employee();
employee.id = 101;
employee.name = "Иванов";
employee.birthday = LocalDate.of("01-01-1999");
employee.occupation = "Программист"
employee.salary = 100000;
employee.join = LocalDate.of("12-01-2018");
session.persist(employee);
 
Client client = new Client();
client.id = 102;
client.name = "Петров";
client.birthday = LocalDate.of("15-11-1988");
client.address = "Шандара";
session.persist(client);

Базаға сақтауда осындай SQL-сұраныс орындалады:


INSERT INTO user_ employee_client (id, name, birthday, occupation, salary, join, DTYPE)
VALUES (101, 'Иванов', '01-01-1999', 'Программист', 100000, '12-01-2018', 'Employee')
 
INSERT INTO user_ employee_client (id, name, birthday, address, DTYPE)
VALUES (102, 'Петров', '15-11-1988', 'Шандара', 'Client')

Деректерді кестеге сақтаған кезде Hibernate тек Entity-лердің белгілі өрістерін жібереді. Бұл белгісіз бағандар NULL болады дегенді білдіреді.

Бұл дегеніміз, сен occupation бағанына NOT NULL типін қоя алмайсың, себебі сол кестеде клиентті сақтағанда, оның occupation NULL болады. Бұл әртүрлі Entity-лерді бір кестеде сақтаудың бір кемшілігі.

SQL-сұраныстың соңғы өрісі - DTYPE бағаны, мұнда Entity-кластың атауы берілген. Ол Hibernate пайдаланған кезде кестеден деректерді оқуда пайдаланылады.

Мысал:


 List<User> accounts = session.createQuery("from User").list();

Бұл сұраныс деректер базасында сақталған барлық User, Employee және Client түріндегі объектілердің тізімін қайтарады. DTYPE бағанының негізінде Entity-тің түрі дұрыс анықталып, дұрыс кластың объектісі жасалады.

Біздің жағдайда accounts тізімінде екі объект болады: Employee типіндегі және Client типіндегі.

HQL күшке ие.

Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION