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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Существует 3 состояния объекта спящего режима (или) Object Сфера спящего режима -

  • Переходное состояние
  • Постоянное состояние
  • отсоединенное состояние

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

Рассмотрим класс POJO как объект-ученик →

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)

Ответ 5

Рассмотрим следующую сущность:

@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.