Списък на държавите

И сега започва забавлението. Ще изучаваме състоянията на обектите Entity. Трябва да платите за всичко, Howто и за използването на Hibernate. Не мислите ли, че изучаването на HQL е такава цена? Не, животът е малко по-сложен.

Ако имате няHowъв обект Entity, който можете да запишете в базата данни с помощта на Hibernate, тогава от гледна точка на Hibernate този обект може да има четири състояния:

  • Преходен
  • Постоянни (or управлявани)
  • Отделен
  • Премахнато

И за да ви заинтересувам, ще добавя тази снимка към тази лекция:

Преходен

Всъщност всичко е много по-просто, отколкото изглежда, макар и не без нюанси. Например, всеки обект Entity, който изрично сте създали с помощта на Java code и не сте заредor от базата данни с помощта на Hibernate, има Преходен (прозрачен) статус.

EmployeeEntity employee = new EmployeeEntity();

Преходният статус означава, че Hibernate няма представа за този обект и ниHowво действие върху обекта не засяга Hibernate, нито работата на Hibernate върху този обект.

Такива обекти се наричат ​​още POJO - обикновен стар Java обект . Терминът често се използва като противоположност на различни обекти с трудно поведение. Помните ли Moc обектите, които Mockito създаде? Тук те не са POJO.

Ако някой клиентски code работи с обект с преходен статус, тогава тяхното взаимодействие може да бъде описано чрез супер проста схема:

Постоянни or управлявани

Следващият най-често срещан случай са обекти, свързани с двигателя на Hibernate. Техният статус се нарича постоянен (or управляван). Има точно два начина да получите обект с този статус:

  • Заредете обект от Hibernate.
  • Запазете обекта в Hibernate.

Примери:

Employee employee = session.load(Employee.class, 1);
Employee employee = new Employee ();
session.save(employee);

Такъв обект обикновено съответства на няHowъв запис в базата данни, има идентификатор и други подобни. Този обект е прикрепен към сесията на Hibernate и като цяло може да бъде представен не от реален обект, а от няHowъв вид прокси.

Напълно възможно е след извикване на метода session.load() да получите обратно няHowъв обект-мъник (прокси) и всички извиквания към базата данни ще се извършват само след извикване на методите на този обект. Но за такива подробности ще говорим малко по-късно.

А взаимодействието между клиентския code и обекта в състояние Managed може да се опише със следната картина:

Отделен

Следващото състояние е, когато обектът е бил отделен от сесията. Тоест, след като обектът е бил прикачен към сесията на Hibernate, но след това сесията е била затворена or транзакцията е приключила и Hibernate вече не следи този обект.

Пример:

session.close();
session.evict(entity);

В първия пример сесията беше затворена. Във втория случай изрично сме посочor, че искаме да отделим обекта от сесията с помощта на метода evict() .

Новата схема за взаимодействие между code и обект ще изглежда така:

И тук става интересно. Ако вашият обект е получен от Hibernate, тогава е вероятно да ви е даден прокси instead of реален обект. И този прокси обект, след прекъсване на връзката със сесията, ще хвърля изключения, когато неговите методи се извикват.

Това е най-честият проблем за всички начинаещи при работа с Hibernate. Трябва да знаете точно във всеки един момент отговора на въпроси като този, когато работите с обект Entity :

  • Имате ли реален обект or просто прокси от реален обект?
  • В момента сте в сделка or не?
  • Транзакция за четене-запис ли е or транзакция само за четене?
  • Обектът управлява ли се от механизма LazyLoading?
  • Кои части от обекта вече са заредени в паметта и кои части ще бъдат заредени при достъп?
  • Как вашият обект е свързан със зависимите обекти?

Добрата новина е, че през повечето време това е очевидно. Но все пак трябва да разберете How работи всичко под капака. Декларативното програмиране е това, което е - можете да напишете code за 10 minutesи, да разберете защо не работи Howто трябва - за 10 часа :)

Премахнато

И последното състояние, което вашият обект Entity може да има, е Премахнато. Както вероятно вече се досещате от името му, това е състоянието на отдалечен обект.

Това състояние се появява поради факта, че ако изтриете няHowъв обект от базата данни, тогава Java обектът няма да изчезне веднага никъде.

Employee employee = session.load(Employee.class, 1);
//after loading the object's state is Persisted

session.remove(employee);
//after deletion, the state of the object is Removed

session.save(employee);
//and now Persisted again

session.close();
//and now the Detached state