hibernate MaterializedClobType хранит длинный объект вместо текста - PullRequest
0 голосов
/ 08 мая 2020

У меня есть класс сущности, в котором поле объявлено как:

    @NotNull
    @Lob
    private String xmlString;

Теперь мне нужно поддерживать совместимость как с Oracle, так и PostgreSQL. Соответствующие определения столбца в DDL: xmlString clob и xmlString text. Приложение работает хорошо, и только в одной проблеме с PostgreSQL значение, хранящееся в столбце xmlString, имеет тип длинный объект вместо исходной xml строки.
Как предлагается здесь , чтобы добавить @Type(type="org.hibernate.type.MaterializedClobType"), что обеспечивает совместимость с Oracle и PostgreSQL, но даже после добавления этой аннотации значение сохраняется в PostgreSQL - это длинный объект вместо исходной xml строки.

Внесенные мной изменения:

    @NotNull
    @Lob
    @org.hibernate.annotations.Type(type = "org.hibernate.type.MaterializedClobType")
    private String xmlMessage;

и значение хранится в xmlString - это число, которое кажется ссылочным идентификатором длинного объекта .

Есть ли возможность сделать эту работу на обоих Oracle и PostgreSQL?


Он хорошо работает в PostgreSQL, если я изменяю аннотацию на @org.hibernate.annotations.Type(type = "org.hibernate.type.TextType"), но тогда возникает ошибка проверки схемы на Oracle.

1 Ответ

0 голосов
/ 12 мая 2020

Чтобы решить эту проблему, я создал собственный диалект, расширив org.hibernate.dialect.PostgreSQL9Dialect и переопределив remapSqlTypeDescriptor следующим образом:

    @Override
    public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor)
    {
        if (sqlTypeDescriptor.getSqlType() == Types.CLOB)
        {
            log.debug("remapping CLOB to LongVarchar");
            return LongVarcharTypeDescriptor.INSTANCE;
        }
        return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
    }

При этом мне не нужно аннотировать поле объекта по

@org.hibernate.annotations.Type(type = "org.hibernate.type.MaterializedClobType")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...