Comments 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,
подробнее можно посмотреть тут
Разная реакций на операции показывает что это никак не частный случай:
— при вызове merge на persistent операция игнорируется, при вызове merge на removed по спеке JPA должен быть выкинут exception,
— при вызове refresh на persistent данные будет переписаны, при вызове на removed по спеке JPA должен быть выкинут exception,
подробнее можно посмотреть тут
Все методы, которые вызываются в методе с данной аннотацией, также имеют доступ к этой транзакции, потому что экземпляр Session является глобальной переменной потока
Определение «текущей» сессии зависит от используемой реализации org.hibernate.context.spi.CurrentSessionContext. Соответственно приведенный вами сценарий скорее имеет отношение к ThreadLocalSessionContext. Понятно, что это скорее глубокие детали внутренней реализации, но вот
глобальную переменную потокастоит уточнить как ThreadLocal)
Большое спасибо за статью!
Sign up to leave a comment.
Hibernate. Основные принципы работы с сессиями и транзакциями