Подтвердить что ты не робот

Почему Hibernate переключился на использование LONG over CLOB?

Похоже, что 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 :(), но это не влияет на отображение типов данных, а только на внутренние SetBigStringTryClob передачи данных, которые не имеют отношения к моему случаю.

Одним из возможных org.hibernate.dialect.Oracle9iDialect этого является переопределение 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, давайте посмотрим, что произойдет.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

Gails ответила на другую аналогичную проблему, ссылающуюся на решение для переопределения диалектов.