Почему Hibernate переключился на использование LONG поверх CLOB? - PullRequest
13 голосов
/ 15 сентября 2010

Похоже, что Hibernate начал использовать тип данных LONG в версии 3.5.5 (мы обновились с 3.2.7) вместо CLOB для свойства type="text".

Это вызывает проблемы, поскольку LONG тип данных в Oracle является старым устаревшим типом данных (см. http://www.orafaq.com/wiki/LONG), который не должен использоваться, и таблицы не могут иметь более одного столбца с LONG как тип данных.

Кто-нибудь знает, почему это было изменено?

Я попытался установить для свойства Oracle SetBigStringTryClob значение true (как предложено в Hibernate> CLOB> Oracle: (), но это не влияет на отображение типов данных, а только на внутренние механизмы передачи данных, которые не имеют отношения к моему делу.

Одним из возможных исправлений для этого является переопределение org.hibernate.dialect.Oracle9iDialect:

public class Oracle9iDialectFix extends Oracle9iDialect {
  public Oracle9iDialectFix() {
    super();
    registerColumnType(Types.LONGVARCHAR, "clob");
    registerColumnType(Types.LONGNVARCHAR, "clob");
  }
}

Однако это последнее средство - переопределение этого класса на шаг ближе к разветвлению Hibernate, чего я бы лучше не делал.

Кто-нибудь может объяснить, почему это было сделано? Это должно быть поднято как ошибка?

[ОБНОВЛЕНИЕ]: я создал https://hibernate.atlassian.net/browse/HHH-5569, давайте посмотрим, что произойдет.

Ответы [ 3 ]

4 голосов
/ 11 января 2011

Похоже, что решение этой проблемы заключается в использовании materialized_clob, по крайней мере, так говорит Гэйл Баднер на HHH-5569 .

Это мне совсем не помогает (и я оставил соответствующий комментарий по этому поводу), но может быть полезным для кого-то еще здесь. В любом случае ошибка отклоняется, и я мало что могу с этим поделать, но использую переопределенный диалект: (

4 голосов
/ 16 сентября 2010

Кто-нибудь может объяснить, почему это было сделано?Должно ли это быть вызвано как ошибка?

Это было сделано для HHH-3892 - Улучшена поддержка отображения SQL LONGVARCHAR и CLOB на строку Java, SQL LONGVARBINARY иБайт BLOB to Java [] (обновление документации отслеживается HHH-4878 ).

И в соответствии с той же проблемой старое поведение было неправильным.

(ПРИМЕЧАНИЕ: в настоящее время org.hibernate.type.TextType неправильно отображает «текст» в java.sql.Types.CLOB; это будет исправлено этой проблемой и обновлено в диалектах базы данных)

Вы всегда можете поднять проблему, но вкратце я понимаю, что вам следует использовать type="clob", если вы хотитеполучить свойство, сопоставленное с CLOB.

PS: предоставление собственного Dialect и объявление его в вашей конфигурации Hibernate (которая не имеет ничего общего с вилкой) - ИМХО не является решением в долгосрочной перспективе.

1 голос
/ 05 июля 2019

Я не могу ответить на ваш вопрос о том, почему, но для Hibernate 6, похоже, они планируют вернуться к использованию CLOB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...