Лучший способ реализовать тип пользователя Hibernate после устаревания?

#hibernate #usertype

#переход в спящий режим #пользовательский тип

Вопрос:

Недавно я получил последнюю версию Hibernate и заметил, что в моих типах пользователей теперь есть предупреждения о том, что методы AbstractStandardBasicType nullSafeGet(ResultSet,String) и nullSafeSet(PreparedStatement, T, int) устарели в пользу их соответствующих методов, которые принимают аргумент SessionImplementor . Проблема в том, что когда вы реализуете UserType, SessionImplementor не передается вам так, как это делается в BasicType, CompositeUserType и т.д.

Я проверил руководство по гибернации, чтобы посмотреть, был ли обновленный пример. В их примере UserType используется get / set вместо nullSafeGet / nullSafeSet , но эти методы также устарели в пользу версий, использующих SessionImplementor. Итак, похоже, что даже официальный пример пользовательского типа Hibernate использует устаревшие методы, что заставляет меня задуматься о двух вещах:

  1. Есть ли хороший способ получить SessionImplementor изнутри UserType?
  2. Если непрактично получать SessionImplementor из UserType, и я не хочу писать свой собственный nullSafeGet / nullSafeSet, должен ли я отказаться от UserType в пользу одной из его альтернатив? Каковы практические различия между UserType и, например, BasicType?

Комментарии:

1. В списке рассылки hibernate-dev есть обсуждение на эту тему: здесь

2. Есть ли решение этой проблемы в 4.1.0.Final? Похоже, что это не так…

3. Хотел бы я вам рассказать. Я перешел на JPA и придерживаюсь стандартных аннотаций JPA, которые, к сожалению, не поддерживают ничего подобного типам пользователей.

Ответ №1:

Спасибо Райану Рэнсфорду за его комментарий к моему первоначальному вопросу. Хотя на самом деле это не решение проблемы, ссылка, которую он предоставил из списка рассылки разработчиков Hibernate, объясняет, почему решение недоступно.

В 3.6.x не может быть предоставлена устаревшая альтернатива, поскольку это нарушило бы реализацию UserType.

Учитывая, что это всего лишь предупреждения об устаревании, не имеет смысла тратить слишком много времени на обходной путь, который устареет, когда будет доступен следующий выпуск, не требующий обслуживания. К сожалению, следующая крупная версия 4.0, а не 3.7, поэтому миграция может потребовать немного больше усилий.

Комментарии:

1. Ок и ..? Итак, если я выполняю миграцию с версии v3.something на версию v4.something, что мне делать с методами nullSafeGet / nullSafeSet моего типа пользователя, которые теперь устарели?

2. @KyleM В итоге я перешел на строгий подход JPA и не мог сказать наверняка. В JavaDocs Hibernate 4.2 я вижу, что устаревшие методы были удалены, но все еще существуют методы nullSafeGet () / Set (), которые принимают SessionImplementor. Я предполагаю, что ваш UserType будет реализовывать эти методы вместо этого, но я не могу прокомментировать правильный подход, поскольку я никогда не делал этого сам.