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


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

5 82

5 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

есть 3 состояния объекта hibernate (или) область объекта hibernate -

  1. переходное состояние
  2. постоянное состояние
  3. отдельно стоящее государства

лучше разобраться с примером код-

рассмотрим класс POJO как объект Student ->

Student student = new Student(); 

теперь этот объект студента находится в переходные государство.


когда мы атташе этот объект POJO в спящий режим сессии ->

session.save(student);

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

(точка зрения сборщика мусора-GC не может уничтожить любой объект, который находится в постоянном состоянии. Поэтому мы можем сказать, что постоянное состояние похоже временное хранилище для объектов POJO)


если мы выполняем->

session.beginTransaction.commit();

тогда объект POJO в состоянии постоянного хранения или хранения базы данных

(точка зрения сборщика мусора-GC не может уничтожить этот объект, потому что этот объект POJO теперь находится вне области JVM и хранится в сформируйте таблицу внутри базы данных.Soo мы можем сказать, что это состояние хранения базы данных, как постоянное хранилище для объектов POJO)


если мы выполняем->

session.evict(student); 

затем объект POJO выселяется или удаляется обратно из постоянного состояния в отдельное состояние.Су это состояние объекта POJO-объект является отдельно стоящее государства.

(точка зрения сборщика мусора-GC может легко уничтожить отделенный объект POJO состояния из JVM)

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

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

даны следующие сущности:

@Entity
public class City {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)    
    private long id;

    // other fields and methods.
}

С Hibernate 5.2 документация (я также включил removed state):

транзиторная

объект только что был создан и не связан с a контекст персистентности. Он не имеет постоянного представления в база данных и обычно значение идентификатора не назначено (если только назначенный генератор был используемый.)

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