Когда использовать метод session.replicate()

Согласно документации по гибернации:, есть небольшой пример того, как использовать session.replicate() и варианты использования для этой функции:

Раздел 11.9. Репликация объекта между двумя разными хранилищами данных:

Варианты использования этой функции включают согласование данных, введенных в разные экземпляры базы данных, обновление информации о конфигурации системы во время обновления продукта, откат изменений, сделанных во время транзакций, отличных от ACID, и многое другое.

Может кто-нибудь, пожалуйста, помогите мне понять, как это полезно в следующих случаях:

  • обновление информации о конфигурации системы во время обновления продукта
  • откат изменений, сделанных во время транзакций, отличных от ACID, и многое другое.

person learner    schedule 20.09.2014    source источник


Ответы (2)


Эта функция не является чем-то, что вы хотите использовать в целом. Если вы хотите сохранить свои объекты с ранее сгенерированным идентификатором, вы можете использовать replicate().

Пример использования для обновления системы

Предположим, вам нужно обновить вашу систему, добавив в нее несколько новых функций и удалив некоторые старые. Теперь вы хотите перенести существующую базу данных на новую, что облегчит ваши новые требования. session.replicate() может быть полезен, как показано ниже:

 myNewObject.setId(myOldObject.getId());
 myNewObject.setExistingProperty(myOldObject.getExistingProperty());
 myNewObject.setNewProperty("my new property");
 session.replicate(myNewObject, ReplicationMode.EXCEPTION);

Пример использования для отката изменений, сделанных в транзакциях, отличных от ACID

Предположим, ваша база данных стала непостоянной при выполнении некоторых транзакций, отличных от ACID. Скажем, в вашей системе есть два класса с именами Course и Student. Во время транзакции без ACID, скажем, объект student1 сохраняется с course1, где объекту student1 уже присвоен идентификатор для course1, но course1 не сохраняется из-за какой-то ошибки. По этой причине ваша БД становится несогласованной (student1 зачислен на несуществующий курс). Чтобы устранить несоответствие, вы просто создаете новый объект Course с данными и id из course1 и сохраняете его с помощью session.replicate().

person Sazzadur Rahaman    schedule 20.09.2014

Метод репликации не сработал для меня, потому что использование GeneratedValue для идентификатора (что очень часто) имеет приоритет над идентификатором, который вы установили. Здесь есть ошибка: https://hibernate.atlassian.net/browse/HHH-2716

Обходной путь — это пользовательский генератор, использующий вместо этого метод слияния. https://stackoverflow.com/a/48819098/728602

person Cadell Christo    schedule 16.02.2018