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

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

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

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

person spaaarky21    schedule 21.05.2011    source источник
comment
На эту тему есть обсуждение в списке рассылки hibernate-dev: здесь   -  person Ryan Ransford    schedule 23.08.2011
comment
Есть ли решение этой проблемы в 4.1.0.Final? Так не кажется...   -  person MetaChrome    schedule 10.04.2012
comment
Хотел бы я рассказать тебе. Я перешел на JPA и придерживаюсь стандартных аннотаций JPA, которые, к сожалению, не поддерживают ничего похожего на UserTypes.   -  person spaaarky21    schedule 04.01.2013


Ответы (1)


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

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

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

person spaaarky21    schedule 20.11.2011
comment
Хорошо и..? Итак, если я перехожу с v3.something на v4.something, что мне делать с методами nullSafeGet/nullSafeSet моего UserType, которые теперь устарели? - person KyleM; 10.06.2013
comment
@KyleM В итоге я перешел на строгий подход JPA и не мог сказать наверняка. В Hibernate 4.2 JavaDocs я вижу, что устаревшие методы были удалены, но все еще есть методы nullSafeGet()/Set(), которые принимают SessionImplementor. Я предполагаю, что ваш UserType вместо этого реализует эти методы, но я не могу комментировать правильный подход, так как я никогда не делал этого сам. - person spaaarky21; 10.06.2013