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>

Как хорошо работал. Новее этого не получилось...