Как стать автором
Обновить

Комментарии 9

Объект-сущность может находиться в одном из 3-х состояний (статусов):
transient object…
persistent object…
detached object...

Простите, а куда у вас делся четвертый removed статус у объектов Entity? В официальной документации hibernet он есть, в JPA2/2.1 он тоже есть. Это довольно важно, так вопрос про статусы Entity встречается практически в любом job interview про хибернет/JPA, после ответа о трех статусах интервью скорее всего тут же и закончится.

Странное определение transient:
transient object. Объекты в данном статусе — это заполненные экземпляры классов-сущностей. Могут быть сохранены в БД. Не присоединены к сессии. Поле Id не должно быть заполнено, иначе объект имеет статус detached ;


В оригинале:
transient — the entity has just been instantiated and is not associated with a persistence context. It has no persistent representation in the database and typically no identifier value has been assigned.

Мне кажется лучше что вроде:
transient — объект-сущность была только инициализирована, но пока ещё не добавлена под управление ORM, не имеет представления в базе данных, ключевые поля, как правило, ещё не заданы.
Да, так и есть, просто в сессиях Hibernate removed — частный случай persistent, по идее.
Нет, removed это совсем другой случай, при removed запись будет удалена после окончания транзакции.

Разная реакций на операции показывает что это никак не частный случай:
— при вызове merge на persistent операция игнорируется, при вызове merge на removed по спеке JPA должен быть выкинут exception,
— при вызове refresh на persistent данные будет переписаны, при вызове на removed по спеке JPA должен быть выкинут exception,

подробнее можно посмотреть тут
А можете скинуть ссылку на эти доки? Потому что все доки Hibernate, которые я изучал, говорили про 4 статуса.
Все методы, которые вызываются в методе с данной аннотацией, также имеют доступ к этой транзакции, потому что экземпляр Session является глобальной переменной потока

Определение «текущей» сессии зависит от используемой реализации org.hibernate.context.spi.CurrentSessionContext. Соответственно приведенный вами сценарий скорее имеет отношение к ThreadLocalSessionContext. Понятно, что это скорее глубокие детали внутренней реализации, но вот
глобальную переменную потока
стоит уточнить как ThreadLocal)
Спасибо, уточнил)
Большое спасибо за статью!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории