2009-07-08 2 views
10

У меня есть столбец в моей SQL-2005 базы данных, которая используется, чтобы быть VARCHAR (макс), но он был изменен на NVARCHAR (макс).Как Hibernate может отображать nvarchar (max) типа данных SQL?

Теперь мне нужно обновить файл сопоставления спящий режим, чтобы отразить изменения, и это то, что он будет использоваться:

< тип элемента = столбец «текст» = «Значение»/>

Когда я пытаюсь запустить приложение, появляется следующее сообщение об ошибке:

org.hibernate.HibernateException: Неверный тип столбца в таблице [] для столбца Value. Найдено: NTEXT, ожидаемый: текст

Что я должен поставить в «типа» атрибут правильно отобразить столбец как NVARCHAR (макс)?

Я пробовал установить тип ntext, но hibernate не знал, что это было. Я попробовал установить тип string, но обработал строка как текст тип.

ответ

7

Найдено ответов на Tremend Tech Blog. Вы должны написать свой собственный класс SQLServerDialect, это выглядит примерно так:

Этот класс отображает типы Hibernate по типам SQL, поэтому класс будет картированию NVARCHAR (макс) SQL тип данных в Hibernate CLOB данные type.

getTypeName метод используется для возврата «NTEXT», когда Hibernate спрашивает о типе данных с кодом 2005 (который выглядит как это NVARCHAR (макс) тип данных).

Наконец, вам нужно сменить диалоги сохранения спящего режима на этот новый класс SQLServerDialect, который позволяет спящим переводить типы данных в типы данных SQL.

+2

Почему вы зарегистрировали тип столбца COLB?и что это означает $ 1 в nvarchar ($ 1)? Спасибо –

+1

Это было давно, и я не могу вспомнить, но registerColumnType() сопоставляет типы SQL с типами Hibernate. $ l (L, а не # 1) - это шаблон соответствия, который представляет длину столбца nvarchar. Если столбец nvarchar имеет определенную длину, он будет сопоставлен с типом VARCHAR. Если столбец nvarchar имеет максимальную длину, он будет сопоставлен с типом CLOB. – ampersandre

+1

Обратите внимание, что для SQL Server 2014 мне пришлось * удалить * переопределенный метод 'getTypeName' в коде выше! – vikingsteve

0

Я думаю, что это registerColumnType (Types.VARCHAR, "nvarchar ($ l)"); // л, как _l_ength, а не 1.

+0

это $ 1. например registerColumnType (Types.NVARCHAR, 4000, «nvarchar ($ 1)»); – Eyal

11

То, что сработало для меня, чтобы поместить фактическое определение столбца в @column аннотации:

@Column(name="requestXml", columnDefinition = "ntext") 
private String request; 
+3

Это работало и на меня. Я использую nvarchar (max) в DB и @Column (name = "colName", columnDefinition = "nvarchar") исправил его. – petrsyn

+0

Спасибо, это сработало и для меня! – digz6666

1

Он может быть закреплен на @Nationalized аннотации из спящего режима, что обозначает тип данных символов, например, национализированный вариант (NVARCHAR, NCHAR, NCLOB и т. д.).

Смежные вопросы