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

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

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

< element type = "text" column = "Value" / >

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

org.hibernate.HibernateException: неправильный тип столбца в [Таблица] для столбца Значение. Найдено: ntext, ожидается: текст

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

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

Ответ 1

Нашел ответ на 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 Data Type to Hibernate CLOB.

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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