Как Hibernate может сопоставить тип данных SQL nvarchar (max)?

У меня есть столбец в моей базе данных SQL-2005, который раньше был varchar (max), но он был изменен на nvarchar (max).

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

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

org.зимовать.HibernateException: неверный тип столбца в [Table] для значения столбца. Найдено: ntext, ожидалось: text

Что я должен поместить в атрибут "type", чтобы правильно отобразить столбец как nvarchar (max)?

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

4 ответов


то, что сработало для меня, - это поместить фактическое определение столбца в аннотацию @Column:

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

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

public class SQLServerNativeDialect extends SQLServerDialect {
     public SQLServerNativeDialect() {
         super();
         registerColumnType(Types.VARCHAR, "nvarchar($l)");
         registerColumnType(Types.CLOB, "nvarchar(max)");
     }

    public String getTypeName(int code, int length, int precision, int scale) throws HibernateException {
        if(code != 2005) {
            return super.getTypeName(code, length, precision, scale);
        } else {
            return "ntext";
        }
    }
}

этот класс сопоставляет типы Hibernate с типами SQL, поэтому класс сопоставит nvarchar (max) тип данных SQL для спящего режима CLOB тип данных.

на getTypeName метод используется для возврата "ntext", когда Hibernate спрашивает о тип данных с кодом 2005(который выглядит как тип данных nvarchar (max)).

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


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


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