Автор оригинала: Vlad Mihalcea.
Вступление
Hibernate переводит мышление разработчика с SQL операторов на переходы состояний сущностей. Как только объект будет активно управляться Hibernate , все изменения будут автоматически перенесены в базу данных.
Манипулировать сущностями модели предметной области (вместе с их ассоциациями) намного проще, чем писать и поддерживать операторы SQL . Без инструмента ORM добавление нового столбца требует изменения всех связанных INSERT /|/UPDATE операторов.
Но Спящий режим тоже не является серебряной пулей. Спящий режим не освобождает нас от беспокойства о фактически выполняемых SQL операторах. Управление Hibernate не так просто, как можно было бы подумать, и обязательно проверять все инструкции SQL | Hibernate выполняется от нашего имени.
Сущность заявляет
Как я уже упоминал ранее, Hibernate отслеживает подключенные в данный момент объекты. Но для того, чтобы объект стал управляемым, он должен находиться в правильном состоянии объекта.
Сначала мы должны определить все состояния сущностей:
- Новое (Переходное)
Вновь созданный объект, который никогда не был связан с Сеанс гибернации (он же Контекст сохранения ) и не сопоставляется ни с одной строкой таблицы базы данных, считается находящимся в Новом (переходном) состоянии.
Чтобы стать сохраняемым, нам нужно либо явно вызвать метод EntityManager#persist , либо использовать механизм транзитивного сохранения.
- Постоянный (Управляемый)
Постоянная сущность была связана со строкой таблицы базы данных, и она управляется текущим запущенным Контекстом сохранения . Любое изменение, внесенное в такую сущность, будет обнаружено и передано в базу данных (во время Сеанса промывки). С помощью Hibernate нам больше не нужно выполнять ВСТАВКИ /| ОБНОВЛЕНИЯ |//УДАЛЕНИЯ операторов. Hibernate использует транзакционный стиль записи рабочий стиль, и изменения синхронизируются в самый последний ответственный момент, во время текущего Сеанса промывки. Отдельный Как только текущий запущенный
- Контекст сохранения
будет закрыт, все ранее управляемые объекты станут отсоединенными . Последующие изменения больше не будут отслеживаться, и автоматическая синхронизация базы данных не произойдет. Чтобы связать отделенную
сущность с активным Сеансом гибернации , вы можете выбрать один из следующих вариантов: Повторное подключение Режим гибернации (но не
- JPA
2.1) поддерживает повторное подключение с помощью метода Session#update . Сеанс гибернации
может связать только один Объект сущности//для данной строки базы данных. Это связано с тем, что контекст сохранения действует как кэш в памяти (кэш первого уровня), и только одно значение (сущность) связано с заданным ключом (типом сущности и идентификатором базы данных). Сущность может быть присоединена повторно, только если нет другого объекта JVM
(соответствующего той же строке базы данных), уже связанного с текущим сеансом гибернации . Слияние Операция
- слияния
будет копировать отделенное состояние сущности (источник) в экземпляр управляемой сущности (назначение). Если объект слияния не имеет эквивалента в текущем сеансе , он будет извлечен из базы данных. Экземпляр отсоединенный
объект будет оставаться отсоединенным даже после операции слияния. Удаленный Хотя
- JPA
- JPA
требует, чтобы удалялись только управляемые объекты , Спящий режим также может удалять отдельные объекты (но только через Сеанс#удалить вызов метода). Удаленная сущность запланирована только для удаления, и фактическая инструкция DELETE
базы данных будет выполнена во время Сеанса во время сброса.
Переходы состояний сущностей
Чтобы изменить состояние объекта JPA, нам нужно использовать один из следующих методов EntityManager
:
В то время как интерфейс Hibernate Session
расширяет JPA EntityManager
, он также предоставляет несколько конкретных методов, которые можно использовать для изменения состояния сущности, как показано на следующей диаграмме:
Вывод
Эти интерфейсы определяют операции перехода состояния сущности, которые мы должны явно вызывать, чтобы уведомить Hibernate об изменении состояния сущности. Во время сброса переход состояния сущности материализуется в инструкцию database DML .
Для получения дополнительной информации о том, как эффективно использовать сохранение и слияние, вам также следует прочитать эту статью.