Почему JPA, Hibernate и jTDS всегда используют varchar (8000) для столбцов String? - PullRequest
2 голосов
/ 27 февраля 2010

Я использую JPA (Hibernate) и jTDS в качестве драйвера jdbc. Всякий раз, когда тип данных столбцов моей сущности - String, созданный подготовленный оператор использует varchar(8000) в качестве параметра. Например, я уже пытался использовать @Column(length=50) в своих сопоставлениях, но это, кажется, игнорируется.

Если я установлю sendStringParametersAsUnicode в соединении jTDS, вместо него будет использоваться nvarchar(4000), но он никогда не будет учитывать длины, которые я определяю в моих сущностях. Есть ли причина для этого?

1 Ответ

1 голос
/ 29 августа 2014

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

В драйвере jtds это кажется преднамеренным.

Если вы посмотрите на TdsData.java, вы увидите, что это происходит в этом кодовом блоке:

} else {
    if (pi.isUnicode && len <= MS_LONGVAR_MAX / 2) {
        pi.tdsType = XSYBNVARCHAR;
        pi.sqlType = "nvarchar(4000)";
    } else if (!pi.isUnicode && len <= MS_LONGVAR_MAX) {
        CharsetInfo csi = connection.getCharsetInfo();
        try {
            if (len > 0 && csi.isWideChars() &&
            pi.getBytes(csi.getCharset()).length > MS_LONGVAR_MAX) {
                pi.tdsType = SYBTEXT;
                pi.sqlType = "text";
            } else {
                pi.tdsType = XSYBVARCHAR;
                pi.sqlType = "varchar(8000)";
            }
...