Hibernate, PostgreSQL: столбец «x» имеет тип OID, но выражение имеет тип байта
-
11-10-2019 - |
Вопрос
У меня есть странная проблема, связанная с картированием 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>
работал тоже. Новее этого не удалось ...