Чем Hibernate различает временные и обособленные сущности?

Цитата из документации:

обособленный

у объекта есть связанный идентификатор, но он больше не связан с контекстом постоянства (обычно из-за того, что контекст постоянства был закрыт или экземпляр был исключен из контекста)

Означает ли это, что в спящем режиме хранятся ссылки на все объекты, которые когда-либо были постоянными? Но тогда это вызовет лизание памяти.

Или это означает, что сущность имеет идентификатор, который соответствует сущности в базе данных, тогда это приведет к двум выводам: 1) Ее можно проверить, только запросив базу данных. 2) Отсоединенный объект может стать временным, если какая-то треть удалит объект из базы данных.


person Hideo Kuze    schedule 24.01.2018    source источник
comment
Вы спрашиваете о конкретном поведении Session.evict () в спящем режиме? Или реализация JPA detach () в спящем режиме? Или JPA вообще?   -  person Nicholas Hirras    schedule 24.01.2018
comment
Если, например, контекст сохранения был закрыт. И отдельные сущности из него использовались в другом контексте персистентности. Как он будет различать обособленные и преходящие сущности?   -  person Hideo Kuze    schedule 24.01.2018


Ответы (3)


Когда объект впервые создается в приложении с помощью оператора new (), он остается в переходном состоянии. Он может перейти в постоянное состояние, когда вы связываете его с сеансом, вызывая метод Session.save (). Когда вы close () сеанс или evict () этот объект из сеанса, он переходит в отключенное состояние. Вы можете снова переместить отсоединенный объект в постоянное состояние, вызвав Session.update () или Session.saveOrUpdate () метод.

person Satya Mahesh    schedule 24.01.2018
comment
Какие отметки обособлены или преходящи в этом объекте? Какие методы в спящем режиме будут по-разному работать с объектами разных типов? Я понимаю, когда происходит переход состояния, но я не понимал, на что он влияет и как это состояние сохраняется. Или это просто классификационный термин, который ни на что не влияет? Тогда зачем это нужно, поскольку это вносит дополнительную сложность в документацию? - person Hideo Kuze; 24.01.2018
comment
Переходный и отдельный объект не связан с сеансом гибернации, между ними есть ключевое различие. Во-первых, отсоединенный объект был связан с сеансом Hibernate в прошлом, и он имеет представление в базе данных, с другой стороны, объект Transient никогда не связан со спящим режимом и не имеет представления в базе данных. - person Satya Mahesh; 24.01.2018

Я не нашел ничего в документации по этому поводу, но я считаю, что он отслеживает отдельные объекты ... например, согласно спецификациям JPA, у вас есть случай, когда объект был извлечен (но его ленивые отношения - нет) .. . Если вы отсоедините этот объект, затем объедините его снова, он считает, что отношения выгружены, но если вы установите отношение на null, то после слияния оно также будет установлено на null ... так как он будет отличаться, если это не так вести учет отключенных ... в поведении cascade.MERGE также есть несколько сценариев, которые могут указывать на то, что он ведет учет ранее отключенных сущностей .... опять же, это то, что я ожидаю, там нет документации

person osama yaccoub    schedule 22.02.2018

saveOrUpdate () выполняет следующие действия:

если объект уже является постоянным в этом сеансе, ничего не делать

если другой объект, связанный с сеансом, имеет тот же идентификатор, генерировать исключение

если у объекта нет свойства идентификатора, save () его

если идентификатор объекта имеет значение, присвоенное вновь созданному объекту, save () его

если для объекта используется версия с помощью или, а значение свойства версии совпадает со значением, присвоенным вновь созданному объекту, save () его

в противном случае update () объект

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html#objectstate-saveorupdate.

Стратегия почти экономия при использовании Spring Data JPA.

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.entity-persistence.saving-entites.strategies

person Mani Rai    schedule 06.04.2020