Рубрики
Без рубрики

Руководство для начинающих по переходам состояний сущностей с помощью JPA и гибернации

Узнайте, что такое переходы между состояниями объектов JPA и Hibernate и как можно использовать методы сохранения, объединения, удаления или поиска.

Автор оригинала: 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

    требует, чтобы удалялись только управляемые объекты , Спящий режим также может удалять отдельные объекты (но только через Сеанс#удалить вызов метода). Удаленная сущность запланирована только для удаления, и фактическая инструкция DELETE

    базы данных будет выполнена во время Сеанса во время сброса.

Переходы состояний сущностей

Чтобы изменить состояние объекта JPA, нам нужно использовать один из следующих методов EntityManager :

В то время как интерфейс Hibernate Session расширяет JPA EntityManager , он также предоставляет несколько конкретных методов, которые можно использовать для изменения состояния сущности, как показано на следующей диаграмме:

Вывод

Эти интерфейсы определяют операции перехода состояния сущности, которые мы должны явно вызывать, чтобы уведомить Hibernate об изменении состояния сущности. Во время сброса переход состояния сущности материализуется в инструкцию database DML .

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