Что такое отдельные, постоянные и временные объекты в спящем режиме? Пожалуйста, объясните на примере.
Что такое отдельные, постоянные и временные объекты в спящем режиме? Пожалуйста, объясните на примере.
Ответы:
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, которые я только перефразировал выше. Безусловно, это необходимо прочитать.
A persistent instance has a representation in the database
Постоянный объект не имеет представления в базе данных до фиксации операции сохранения.
Объект в спящем режиме имеет следующие состояния:
Переходный процесс - объекты, созданные с помощью оператора new, называются временными объектами.
Объект является временным, если он только что был создан с помощью оператора new и не связан с сеансом Hibernate. Он не имеет постоянного представления в базе данных, и ему не было присвоено значение идентификатора. Временные экземпляры будут уничтожены сборщиком мусора, если приложение больше не хранит ссылку.
Постоянный - объект, с которым связан идентификатор базы данных, называется постоянным объектом.
Постоянный экземпляр имеет представление в базе данных и значение идентификатора. Возможно, он был просто сохранен или загружен; тем не менее, это по определению входит в объем сеанса. Hibernate обнаружит любые изменения, внесенные в объект в постоянном состоянии, и синхронизирует состояние с базой данных после завершения единицы работы.
Отсоединенный - отсоединенный экземпляр - это объект, который был постоянным, но его сеанс был закрыт.
Отсоединенный экземпляр может быть повторно подключен к новому сеансу позже, что снова сделает его постоянным. Эта функция позволяет использовать модель программирования для длительных единиц работы, требующих от пользователя времени на размышления. Мы называем их транзакциями приложений, т. Е. Единицей работы с точки зрения пользователя.
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
Позвольте мне также объяснить с точки зрения сборщика мусора.
Есть 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)
Учитывая следующую сущность:
@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 .
Помимо правильного ответа, уже идентифицированные постоянные, временные, отдельные - это просто состояние объекта в спящем режиме.
Чтобы быть более точным, эти три состояния фактически показывают изменения объекта гибернации и статус жизненного цикла сеанса.