Я пытаюсь сохранить объект в 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 как байт [] безрезультатно:
@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 или что?