Які відокремлені, стійкі та перехідні предмети в сплячому режимі? Поясніть, будь ласка, на прикладі.
Які відокремлені, стійкі та перехідні предмети в сплячому режимі? Поясніть, будь ласка, на прикладі.
Відповіді:
new
Примірник класу персистирующего , який не пов'язаний з Session
, не має уявлення в базі даних , і ніякого значення ідентифікатора не рахується , що перехідним від Hibernate:
Person person = new Person();
person.setName("Foobar");
// person is in a transient state
Стійким екземпляр має уявлення в базі даних, значення ідентифікатора і асоціюється з Session
. Ви можете зробити перехідний екземпляр стійким , пов’язавши його з Session
:
Long id = (Long) session.save(person);
// person is now in a persistent state
Тепер, якщо ми перебуваємо close
в режимі Hibernate Session
, стійкий екземпляр стане відокремленим екземпляром: він більше не приєднаний до іншого Session
(але все ж може бути модифікований та приєднаний до нового Session
пізніше).
Все це чітко пояснено у всій главі 10. Робота з об'єктами документації про сплячку, яку я перефразую лише вище. Однозначно, обов’язково читати.
A persistent instance has a representation in the database
Постійний суб'єкт не має представлення в базі даних, перш ніж здійснити операцію збереження.
Об'єкт у сплячому режимі має такі стани:
Тимчасовий - Об'єкти, ініційовані за допомогою нового оператора, називаються перехідними об'єктами.
Об'єкт є тимчасовим, якщо він нещодавно був створений за допомогою нового оператора, і він не пов'язаний із сплячим сеансом. У ньому немає постійного представлення в базі даних і не присвоєно значення ідентифікатора. Перехідні екземпляри будуть знищені сміттєзбірником, якщо програма більше не містить посилання.
Постійний - Об'єкт, який має пов’язану з ним ідентичність бази даних, називається стійким об'єктом.
Постійний екземпляр має представлення в базі даних та значення ідентифікатора. Це може бути просто збережено або завантажено; однак це є за визначенням в рамках сесії. Hibernate виявить будь-які зміни, внесені до об'єкта в стійкому стані, і синхронізує стан з базою даних, коли блок роботи завершиться.
Окремлений - відокремлений екземпляр - це об'єкт, який зберігається, але його сесія закрита.
Окремий екземпляр можна буде приєднати до нового сеансу в більш пізній час, зробивши його стійким знову. Ця функція дозволяє модель програмування для тривалих одиниць роботи, які потребують часу для роздумів користувачів. Ми називаємо їх прикладними транзакціями, тобто одиницею роботи з точки зору користувача.
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
Дозвольте мені пояснити і з точки зору збирача сміття.
Існує 3 об'єктних стану сплячого (або) Об'єктного сну.
Краще розібратися з прикладом коду-
Розглянемо клас POJO як об'єкт Student->
Student student = new Student();
Зараз цей студентський об’єкт перебуває у перехідному стані .
Коли ми додаємо цей об'єкт POJO до сплячого сеансу->
session.save(student);
Зараз цей об'єкт POJO знаходиться в стійкому стані .
(Точка зору збору сміття - GC не може видалити будь-який об'єкт, який перебуває у постійному стані. Тому ми можемо сказати, що стійкий стан - це як тимчасове сховище для об'єктів POJO )
Якщо ми виконуємо->
session.beginTransaction.commit();
то об'єкт POJO знаходиться у стані постійного зберігання або бази даних
(Точка зору збору сміття - GC не може стерти цей об'єкт, оскільки цей об'єкт POJO зараз виходить за межі JVM і зберігається у таблиці форм всередині бази даних. Тому можна сказати, що цей стан зберігання бази даних схожий на постійне зберігання для POJO об’єкти )
Якщо ми виконуємо->
session.evict(student);
потім об'єкт POJO виселяється або видаляється з постійного стану в відірваний стан. Так цей стан об'єкта POJO є відокремленим станом .
(Точка збору сміття - GC може легко стерти відокремлений об'єкт POJO стану з JVM)
З огляду на таку організацію:
@Entity
public class City {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
// other fields and methods.
}
З документації зі сплячого режиму 5.2 (я також включив removed
штат):
минущі
суб'єкт господарювання щойно створений і не пов'язаний із стійким контекстом. Він не має постійного представлення в базі даних і, як правило, не присвоюється значення ідентифікатора (якщо тільки не був використаний призначений генератор).
City city = new City();
керований або наполегливий
суб'єкт господарювання має асоційований ідентифікатор і пов'язаний із стійким контекстом. Він може або не може фізично ще існувати в базі даних.
// city will be in a managed/persistent state and any changes to it, will be tracked by hibernate
// and reflected to the database when the persistence context is flushed.
session.save(city);
відірваний
суб'єкт господарювання має пов'язаний ідентифікатор, але він більше не асоціюється з стійким контекстом (як правило, тому, що контекст стійкості був закритим або екземпляр був вилучений з контексту)
// city is in a detached state, Hibernate is no longer aware of the entity
session.evict(city)
вилучено
Суб'єкт має асоційований ідентифікатор і пов'язаний зі стійким контекстом, однак він планується для видалення з бази даних.
session.remove(city);
Примітка:
Hibernate API пропонує пари методів для перемикання між сутнісними станами, і я вважаю, що варто вивчити клас гібернатової сесії .
Окрім правильної відповіді, вже визначені стійкі, перехідні, відсторонені - це лише стан об’єкта в сплячому стані.
Якщо бути точнішим, ці три стани фактично показують зміни об'єкта сплячки та стан життєвого циклу сеансу