Hibernate, Postgresql: столбец "x" имеет тип oid, но выражение имеет тип byte - PullRequest
13 голосов
/ 20 декабря 2010

У меня странная проблема, связанная с отображением спящего режима, содержащим большие объекты (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, однако в спящем режиме, используя это, знает, как хранить и извлекать данные из такого поля

@Lob
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
private byte[] binaryFile;

Ответы [ 2 ]

11 голосов
/ 20 декабря 2010

Это сопоставление полей определено в org.hibernate.dialect.PostgreSQLDialect и может быть изменено путем подкласса этого и настройки вашего приложения на использование измененного диалекта при работе с postgres.

Соответствующее заклинание в подклассе, вероятно, должно поставить

    registerColumnType( Types.BLOB, "bytea" );

в вашем конструкторе после вызова super().

0 голосов
/ 31 января 2018

Для меня это могло бы означать, что однажды "верните вашу версию postgres jdbc обратно к 9.3-1101.jdbc4"

  <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.4-1200-jdbc41</version>
  </dependency>

тоже сработало. Новее этого не удалось ...

...