Почему 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, давайте посмотрим, что произойдет.
Ответы
Ответ 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 ответила на другую аналогичную проблему, ссылающуюся на решение для переопределения диалектов.
Ответ 4
Я не могу ответить на ваш вопрос о том, почему, но для Hibernate 6 кажется, что они рассматривают возможность вернуться к использованию CLOB