Hibernate, Postgresql: столбец "x" имеет тип oid, но выражение имеет тип byte
у меня странная проблема с отображением hibernate, содержащим большие объекты (BLOB), при переключении между различными базами данных.
@Lob
private byte[] binaryData;
поле выше создает поле массива байтов в MySQL и Oracle, однако в PostreSQL оно создает поле типа oid.
теперь, когда я пытаюсь получить доступ к этому полю, он отлично работает в других базах данных, но в PostgreSQL он терпит неудачу со следующей ошибкой
Column "binaryData" is of type oid but expression is of type bytea.
поэтому я попытался просто удалить Аннотация "@Lob", которая решит проблему для PostgreSQL, однако в MySQL без этой аннотации hibernate создает поле типа" tinyblob", которое является небольшим в большинстве наших случаев. И, поскольку мы хотим использовать этот проект более чем в одной среде, раздражает наличие двух разных сопоставлений для переключения.
есть ли аннотация, которая заставляет postgreSQL использовать bytea вместо oid для полей, аннотированных @Lob? Или как-то можно опустить @Lob и поставить что-то иначе, чтобы заставить MySQL выделить его с большим типом данных, как это было бы с помощью @Lob?
Я мог бы даже представить себе такое решение
if (field is of type oid)
store it as oid
else if (field is of type bytea)
store it as bytea
else
// not storable
и то же самое, что и геттер, если существует способ сделать это
EDIT:
работает следующее объявление. Он выделяет столбец как oid, однако hibernate с помощью этого знает, как хранить и извлекать данные из такого поля
@Lob
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
private byte[] binaryFile;
2 ответов
это сопоставление полей определяется в org.hibernate.dialect.PostgreSQLDialect
и может быть изменен путем подкласса этого и настройки вашего приложения для использования измененного диалекта при работе с postgres.
соответствующее заклинание в подклассе, вероятно, поставить
registerColumnType( Types.BLOB, "bytea" );
в конструкторе после вызова super()
.
для меня это может означать, что однажды " верните свою версию postgres jdbc обратно в 9.3-1101.jdbc4"
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1200-jdbc41</version>
</dependency>
Как хорошо работал. Новее этого не получилось...