Я пытаюсь сохранить объект в PostgreSQL, который использует UUID в качестве первичного ключа. Я пытался сохранить его как обычный UUID:
@Id
@Column(name = "customer_id")
private UUID id;
С вышеизложенным я получаю эту ошибку:
ERROR: column "customer_id" is of type uuid but expression is of type bytea
Hint: You will need to rewrite or cast the expression.
Position: 137
Я также пытался сохранить UUID как byte[] безрезультатно:
@Transient
private UUID id;
@Id
@Column(name = "customer_id")
@Access(AccessType.PROPERTY)
@Lob
protected byte[] getRowId() {
return id.toString().getBytes();
}
protected void setRowId(byte[] rowId) {
id = UUID.fromString(new String(rowId));
}
Если я удалю @Lob, я получу ту же ошибку, что и выше. Но с применением @Lob ошибка немного меняется на:
ERROR: column "customer_id" is of type uuid but expression is of type bigint
Hint: You will need to rewrite or cast the expression.
Position: 137
Я чувствую себя очень плохо, потому что не могу сделать что-то настолько простое, как это!
Я использую Hibernate 4.1.3.Final с PostgreSQL 9.1.
Я видел множество вопросов на SO более или менее с одной и той же проблемой, но все они старые, и ни один из них, похоже, не имеет прямого ответа.
Я хотел бы добиться этого стандартным способом, не прибегая к уродливым хакам. Но если этого можно добиться только с помощью (уродливых )хаков, то, может быть, я так и поступлю. Однако я не хочу хранить UUID как varchar в базе данных, так как это не очень хорошо для производительности. Кроме того, я бы не хотел, если это возможно, вводить в свой код зависимость от Hibernate.
Любая помощь будет принята с благодарностью.
ОБНОВЛЕНИЕ 1(2012 -07 -03 12 :15 вечера)
Ну-ну-ну... Довольно интересно, что я протестировал точно такой же код (простой UUID, без преобразования --первую версию кода, опубликованного выше )с SQL Server 2008 R2 с использованием драйвера JTDS (v1.2.5 )и, угадайте что, это сработало как шарм (конечно, мне пришлось изменить информацию о подключении -в файле persistence.xml ).
Теперь, это конкретная проблема PostgreSQL -или что?