Hibernate, PostgreSQL: столбец «x» имеет тип OID, но выражение имеет тип байта

StackOverflow https://stackoverflow.com/questions/4488693

Вопрос

У меня есть странная проблема, связанная с картированием Hibernate, содержащим большие объекты (Blob), при переключении между различными базами данных.

@Lob
private byte[] binaryData;

Поле выше создает байтовое поле в MySQL и в Oracle, однако в PotresQl он создает поле OID типа.

Теперь, когда я пытаюсь получить доступ к этому поле, он работает нормально в других базах данных, но в PostgreSQL он не удается со следующей ошибкой

Column "binaryData" is of type oid but expression is of type bytea.

Поэтому я попытался просто удалить аннотацию «@lob», которая решит проблему для PostgreSQL, однако в MySQL без этой аннотации Hibernate создает поле типа «TinyBlob», которое в большинстве случаев мало. И, поскольку мы хотим использовать этот проект в более чем одной среде, это раздражает, чтобы иметь две разные сопоставления для переключения.

Существует ли какая -либо аннотация, которая заставляет PostgreSQL использовать байта вместо 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

и то же самое, что и Getter, если существует способ сделать это.

РЕДАКТИРОВАТЬ:

Следующее объявление работает. Он выделяет столбец как OID, однако, используя это, используя это, знает, как хранить и получать данные из такого поля

@Lob
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
private byte[] binaryFile;
Это было полезно?

Решение

Это картирование поля определено в 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>

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top