JPA 2 (EclipseLink) Попытка использовать UUID в качестве первичного ключа. EntityManager.find () всегда вызывает исключение (база данных - PostgreSQL) - PullRequest
5 голосов
/ 30 октября 2010

Я пытаюсь использовать UUID для первичного ключа, используя JPA 2 (EclipseLink). Я использую PostgreSQL в качестве базы данных. Моя сущность объявлена ​​следующим образом: у меня есть таблица Employee с установленным в качестве UUID PK. У меня есть сопоставление сущности JPA с таблицей сотрудников, которая выглядит следующим образом:

@Entity
public class Employee {
    @Id
    private String id;
    ...
    ...
}

Когда я вызываю EntityManager.find (Employee.class, id)

Я получаю исключение из postgres:

Внутреннее исключение: org.postgresql.util.PSQLException: ОШИБКА: оператор не существует: uuid = символ меняется

Подсказка: ни один оператор не соответствует указанному имени и типу аргумента. Возможно, вам придется добавить явные приведения типов.

Я также пытался изменить идентификатор в классе Employee на java.util.UUID, но затем получаю следующее (очень похожая ошибка):

Внутреннее исключение: org.postgresql.util.PSQLException: ОШИБКА: оператор не существует: uuid = bytea Подсказка: ни один оператор не соответствует указанному имени и типу аргумента. Возможно, вам придется добавить явные приведения типов.

Я действительно не уверен, как это исправить ... у кого-нибудь есть идеи?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 30 октября 2010

Я пытаюсь использовать UUID для первичного ключа с использованием JPA 2 (EclipseLink)

К сожалению, стандартный JPA не включает UUID в качестве стратегии для сгенерированных идентификаторов.

Я также попытался изменить идентификатор в классе Employee на java.util.UUID (...)

Это недопустимый тип для Id (который рассматривался как Serializable в вашем случае). Спецификация JPA 2.0 гласит:

2.4 Первичные ключи и идентификационные данные сущности

...

Простой первичный ключ или поле или свойство составного первичного ключа. должен быть одним из следующих типов: любой тип примитива Java; любой примитив тип обертки; java.lang.String; java.util.Date; java.sql.Date; java.math.BigDecimal; java.math.BigInteger. Если первичный ключ является составным первичным ключом полученный из первичного ключа другой объект, первичный ключ может содержит атрибут, тип которого что из первичного ключа ссылка на объект, как описано в Раздел 2.4.1. Субъекты, чей основной ключи используют типы, отличные от этих не быть переносимым. Если генерируется первичный ключи используются, только целые типы будет портативным Если java.util.Date используется в качестве поля первичного ключа или свойство, временный тип должен быть указано как DATE.

Другими словами, если есть решение, оно будет зависеть от поставщика.

Я действительно не знаю, как это исправить ... у кого-нибудь есть идеи?

Вам необходимо настроить EL для настраиваемой последовательности и предоставить генератор настраиваемой последовательности. См. EclipseLink / examples / JPA / CustomSequencing для полного примера (с использованием генератора UUID).

1 голос
/ 01 ноября 2010

Ошибка, кажется, указывает на то, что вы привязываете идентификатор как строку, но база данных не позволяет этого.Если вы обращаетесь к этому типу напрямую из JDBC, какой тип возвращается?Вам может понадобиться использовать этот тип в вашем классе и отобразить его с помощью конвертера.

См., http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#Using_EclipseLink_JPA_Converters

EclipseLink также позволяет установить тип JDBC для DatabaseField, что может помочь с привязкойтип.

...