Які відокремлені, стійкі та перехідні предмети в сплячому режимі?


100

Які відокремлені, стійкі та перехідні предмети в сплячому режимі? Поясніть, будь ласка, на прикладі.


після session.close не видалить усі об’єкти, які були стійкістю в межах сеансу?
Джигар Джоші

Так, він буде видалений, тому щоразу, коли ви закриєте сеанс, стійкий стан об'єкта буде перетворений на стан окремого.
Рейчел

@Rachel приємне посилання, надане кодом для глибшого розуміння
Priyank Thakkar

Відповіді:


161

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. Робота з об'єктами документації про сплячку, яку я перефразую лише вище. Однозначно, обов’язково читати.


Значення ідентифікатора, ймовірно, не є суворою умовою, щоб об'єкт був стійким, оскільки я міг використовувати призначену стратегію генерації ідентифікаторів.
Абхієет Кашня

Крім закриття сеансу, який читається в екземплярі, можна від'єднати примірник, зателефонувавши session.evict (). Це позбавляє його від керування Hibernate (таким чином, запобігання автоматичному відновленню змін до примірника). Ви можете надіслати зміни до db за допомогою session.update () та повторно вкласти їх у session.merge ().
Мушу

1
Ми багато разів не стежимо за оригінальними документами, наданими рамками .. які колись самі приховують інформацію з належним описом, просто потрібно вивчити. Єдине завдання - це не легко знайти :)
1414

A persistent instance has a representation in the databaseПостійний суб'єкт не має представлення в базі даних, перш ніж здійснити операцію збереження.
О.Бадр

1
Отже, відмінна і перехідна сутність різниці - це наявність ідентифікатора ? Якщо я створюю новий екземпляр з присвоєним ідентифікатором, то формально він є тимчасовим, оскільки він ще не зберігається, але його не можна відрізнити від відокремленого, оскільки він має ідентифікатор. Правильно?
Руслан Стельмаченко

9

Об'єкт у сплячому режимі має такі стани:

Тимчасовий - Об'єкти, ініційовані за допомогою нового оператора, називаються перехідними об'єктами.

Об'єкт є тимчасовим, якщо він нещодавно був створений за допомогою нового оператора, і він не пов'язаний із сплячим сеансом. У ньому немає постійного представлення в базі даних і не присвоєно значення ідентифікатора. Перехідні екземпляри будуть знищені сміттєзбірником, якщо програма більше не містить посилання.

Постійний - Об'єкт, який має пов’язану з ним ідентичність бази даних, називається стійким об'єктом.

Постійний екземпляр має представлення в базі даних та значення ідентифікатора. Це може бути просто збережено або завантажено; однак це є за визначенням в рамках сесії. Hibernate виявить будь-які зміни, внесені до об'єкта в стійкому стані, і синхронізує стан з базою даних, коли блок роботи завершиться.

Окремлений - відокремлений екземпляр - це об'єкт, який зберігається, але його сесія закрита.

Окремий екземпляр можна буде приєднати до нового сеансу в більш пізній час, зробивши його стійким знову. Ця функція дозволяє модель програмування для тривалих одиниць роботи, які потребують часу для роздумів користувачів. Ми називаємо їх прикладними транзакціями, тобто одиницею роботи з точки зору користувача.

http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012


5

Дозвольте мені пояснити і з точки зору збирача сміття.

Існує 3 об'єктних стану сплячого (або) Об'єктного сну.

  1. Тимчасовий стан
  2. стійкий стан
  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)


2

З огляду на таку організацію:

@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 пропонує пари методів для перемикання між сутнісними станами, і я вважаю, що варто вивчити клас гібернатової сесії .


0

Окрім правильної відповіді, вже визначені стійкі, перехідні, відсторонені - це лише стан об’єкта в сплячому стані.

Якщо бути точнішим, ці три стани фактично показують зміни об'єкта сплячки та стан життєвого циклу сеансу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.