Что такое отдельные, постоянные и временные объекты в спящем режиме?


101

Что такое отдельные, постоянные и временные объекты в спящем режиме? Пожалуйста, объясните на примере.


после session.close не удалит ли он все объекты, которые были постоянными в области сеанса?
Джигар Джоши,

Да, он будет удален, поэтому всякий раз, когда вы закрываете сеанс, постоянное состояние объекта преобразуется в состояние «Отсоединено».
Рэйчел

@Rachel хорошая ссылка с кодом для более глубокого понимания
Приянк Таккар

Ответы:


162

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, постоянный экземпляр станет отдельным экземпляром: он больше не привязан к a Session(но все равно может быть изменен и присоединен к новому Sessionпозже).

Все это ясно объясняется во всей Главе 10. Работа с объектами документации Hibernate, которые я только перефразировал выше. Безусловно, это необходимо прочитать.


Значение идентификатора, вероятно, не является строгим условием для сохранения объекта, поскольку я мог бы использовать стратегию генерации назначенного идентификатора.
Abhijeet Kashnia

Помимо закрытия сеанса чтения в экземпляре, можно отсоединить экземпляр, вызвав session.evict (). Это удаляет его из-под управления Hibernate (таким образом предотвращая автоматическое распространение изменений экземпляра обратно в базу данных). Вы можете отправить изменения в базу данных через session.update () и повторно прикрепить их с помощью session.merge ().
Mooshu

1
Мы часто не следуем оригинальной документации, предоставляемой фреймворками ... которые иногда сами содержат скрытую информацию с надлежащим описанием, которую просто необходимо изучить. Единственная проблема в том, что мы не находим это легко :)
agpt

A persistent instance has a representation in the databaseПостоянный объект не имеет представления в базе данных до фиксации операции сохранения.
O.Badr

1
Итак, отличие обособленной и временной сущностей - это наличие ID ? Если я создаю новый экземпляр с назначенным идентификатором, то формально он временный, потому что он еще не сохраняется, но его нельзя отличить от отсоединенного, потому что у него есть идентификатор. Правильно?
Руслан Стельмаченко

9

Объект в спящем режиме имеет следующие состояния:

Переходный процесс - объекты, созданные с помощью оператора new, называются временными объектами.

Объект является временным, если он только что был создан с помощью оператора new и не связан с сеансом Hibernate. Он не имеет постоянного представления в базе данных, и ему не было присвоено значение идентификатора. Временные экземпляры будут уничтожены сборщиком мусора, если приложение больше не хранит ссылку.

Постоянный - объект, с которым связан идентификатор базы данных, называется постоянным объектом.

Постоянный экземпляр имеет представление в базе данных и значение идентификатора. Возможно, он был просто сохранен или загружен; тем не менее, это по определению входит в объем сеанса. Hibernate обнаружит любые изменения, внесенные в объект в постоянном состоянии, и синхронизирует состояние с базой данных после завершения единицы работы.

Отсоединенный - отсоединенный экземпляр - это объект, который был постоянным, но его сеанс был закрыт.

Отсоединенный экземпляр может быть повторно подключен к новому сеансу позже, что снова сделает его постоянным. Эта функция позволяет использовать модель программирования для длительных единиц работы, требующих от пользователя времени на размышления. Мы называем их транзакциями приложений, т. Е. Единицей работы с точки зрения пользователя.

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


5

Позвольте мне также объяснить с точки зрения сборщика мусора.

Есть 3 состояния объекта спящего режима (или) Объем объекта спящего режима:

  1. Переходное состояние
  2. постоянное состояние
  3. обособленное состояние

Лучше понять на примере кода -

Давайте рассмотрим класс POJO как Student Object->

Student student = new Student(); 

Теперь этот студенческий объект находится в переходном состоянии .


Когда мы присоединяем этот объект POJO к сеансу гибернации->

session.save(student);

Теперь этот объект POJO находится в постоянном состоянии .

(Точка зрения сборщика мусора: сборщик мусора не может уничтожить любой объект, который находится в постоянном состоянии. Таким образом, мы можем сказать, что постоянное состояние похоже на временное хранилище для объектов 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.
}

Из документации Hibernate 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 предлагает несколько методов для переключения между состояниями сущностей, и я думаю, что стоит изучить класс Hibernate Session .


0

Помимо правильного ответа, уже идентифицированные постоянные, временные, отдельные - это просто состояние объекта в спящем режиме.

Чтобы быть более точным, эти три состояния фактически показывают изменения объекта гибернации и статус жизненного цикла сеанса.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.