Списък на държавите
И сега започва забавлението. Ще изучаваме състоянията на обектите 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
GO TO FULL VERSION