Как реализовать Seed и Next при расширении UserVersionType - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь реализовать строковый UserVersionType. Я нашел достаточно примеров, чтобы понять, как использовать методы UserType в определенной степени. Я не могу найти ничего, что бы точно указывало мне, что делать с next () и seed ().

Итак, у меня есть что-то вроде этого

public class StringVersionType implements UserType, UserVersionType {
    ...

    public int compare(Object o1, Object o2) {
        String a = (String) o1;
        String b = (String) o2;

        return a.compareTo(b);
    }

    public Object next(Object arg0, SharedSessionContractImplementor arg1)           
    {

           return "DUMMY SEED";  // + LocalTime.now().toString();
    }

    public Object seed(SharedSessionContractImplementor session){
        return "DUMMY SEED"; // LocalTime.now().toString();
    }

}

Я попытался добавить простой код для возврата строки, которая всегда одинакова, и кода, который может изменить номер версии. Я всегда получаю ошибку при обновлении. Если посмотреть на вывод консоли hibernate, когда я добавляю почти что-нибудь в эти методы UserVersionType, то hibernate прекращает делать выбор, а затем обновляет, но всегда переходит непосредственно к новому запросу вставки и, таким образом, происходит сбой первичного ключа.

Очевидно, я не понимаю, что нужно делать семенам и следующим, но я не могу найти какую-либо полезную документацию?

Кто-нибудь может рассказать мне больше о том, как их использовать?

1 Ответ

0 голосов
/ 26 января 2019

Seed:

Создание начальной версии. Параметры: сеанс - сеанс, из которого исходит этот запрос. Может быть нулевым; в настоящее время это происходит только при запуске при попытке определить «несохраненное значение» сущностей. Возвращает: экземпляр типа

@Override
  public Object 
 seed(SharedSessionContractImplementor session) 
  {
  return ( (UserVersionType) userType ).seed( 
  session );
 }

Для свойств, сопоставленных с версией или отметкой времени, оператор вставки предоставляет вам два варианта. Вы можете либо указать свойство в списке свойств, в этом случае его значение берется из соответствующих выражений выбора, либо пропустить его из списка свойств, и в этом случае используется начальное значение, определенное в org.hibernate.type.VersionType

next:

Увеличить версию. Параметры: сеанс - сеанс, из которого исходит этот запрос. current - текущая версия Возвращает: экземпляр типа

public Object next(Object current, 
SessionImplementor session) {
return ( (UserVersionType) userType ).next(  current, session );
}

Из документов:

"Операторы UPDATE по умолчанию не влияют на значения версии или значения атрибута метки времени для затронутых объектов. Однако вы можете заставить Hibernate установить значения атрибута версии или метки времени с помощью обновления с контролем версий. Это достигается добавив ключевое слово VERSIONED после ключевого слова UPDATE. Обратите внимание, однако, что это особенность Hibernate и она не будет работать переносимым способом. Пользовательские типы версий org.hibernate.usertype.UserVersionType не допускаются в связи с обновлением версионное утверждение. "

Другие документы:

Выделенный номер версии Механизм номера версии для оптимистической блокировки обеспечивается аннотацией @Version.

Аннотация @Version

  @Entity
   public class Flight implements Serializable {
   ...
  @Version
  @Column(name="OPTLOCK")
   public Integer getVersion() { ... }
   }   

Здесь свойство version сопоставляется со столбцом OPTLOCK, и менеджер сущностей использует его для обнаружения конфликтующих обновлений и предотвращения потери обновлений, которые будут перезаписаны стратегией last-commit-wins.

Столбец версии может быть любого типа, если вы определяете и реализуете соответствующий тип UserVersionType.

Вашему приложению запрещено изменять номер версии, установленный Hibernate. Чтобы искусственно увеличить номер версии, см. Документацию по свойствам LockModeType.OPTIMISTIC_FORCE_INCREMENT или LockModeType.PESSIMISTIC_FORCE_INCREMENTcheck в справочной документации Hibernate Entity Manager.

Номера версий, сгенерированные базой данных Если номер версии генерируется базой данных, например триггером, используйте аннотацию @ org.hibernate.annotations.Generated (GenerationTime.ALWAYS).

Объявление свойства версии в hbm.xml

 <version
    column="version_column"
    name="propertyName"
    type="typename"
    access="field|property|ClassName"
    unsaved-value="null|negative|undefined"
    generated="never|always"
    insert="true|false"
    node="element-name|@attribute- 
    name|element/@attribute|."
 />

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

...