Что такое отдельные, постоянные и временные объекты в спящем режиме? - PullRequest
88 голосов
/ 04 апреля 2010

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

Ответы [ 5 ]

152 голосов
/ 05 апреля 2010

A new экземпляр постоянного класса, который не связан с Session, не имеет представления в базе данных, и значение идентификатора не считается переходным Hibernate:

Person person = new Person();
person.setName("Foobar");
// person is in a transient state

A постоянный экземпляр имеет представление в базе данных, значение идентификатора и связан с Session. Вы можете создать временный экземпляр постоянный , связав его с Session:

Long id = (Long) session.save(person);
// person is now in a persistent state

Теперь, если мы close в спящем режиме Session, постоянный экземпляр станет отсоединенным экземпляром: он больше не присоединяется к Session все еще может быть изменен и присоединен к новому Session позже).

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

7 голосов
/ 30 января 2017

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

Transient - объекты, созданные с использованием оператора new, называются временными объектами.

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

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

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

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

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

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

3 голосов
/ 14 октября 2017

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

Существует 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)

1 голос
/ 19 ноября 2017

Дано следующее лицо:

@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 голосов
/ 15 декабря 2016

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...