2013-02-13 4 views
2

Интересно, как отображать с перечислением Java Java и перечислением типа PostgreSQL?PostgreSQL, enum, JPA, EclipseLink

В PostgreSQL стороне я создал этот тип:

CREATE TYPE langage AS ENUM ('FR', 'EN', 'DE'); 

И у меня есть Java перечисление:

public enum LangageEnum { 
    FR, 
    EN, 
    DE; 
} 

Мой JPA сущности поле это одна:

@Enumerated(EnumType.STRING) 
@Column(name="langage") 
private LangageEnum langage = LangageEnum.FR; 

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

Вызвать: org.postgresql.util.PSQLException: ERREUR: la colonne «langage» est de type pretoria.langage mais l'expression est тип характера, различающийся Показатель: Vous devez réécrire l'expression ou lui appliquer une transform тип.

Я думаю, что смогу добиться успеха с помощью ObjectTypeConverter как показано here

но ObjectTypeConverter является EclipseLink аннотацию, не JPA поэтому я ищу другой способ сделать это.

Итак, как я могу перечислить перечисление Java в PostgreSQL enum, пожалуйста?

+0

Стандартная JPA не поддерживает пользовательские преобразователи. Вам не повезло, если вы не хотите использовать специальные конвертеры eclipselink, вам нужно использовать либо String, либо Integer. –

+0

Я могу использовать конвертер EclipseLink. Мне было интересно, есть ли более «конвенциональный» и абстрактный способ сделать это. Thx –

+0

Я не могу добиться успеха ... У вас есть код, пожалуйста? –

ответ

1

Кажется, что вы создали тип перечисления в Postgres, но как насчет поля в таблице?

Это работает для меня:

Enum

public enum CampaignState 
{ 
    READY, 
    RUNNING, 
    PAUSED, 
    FINISHED; 
} 

Entity

... 
@NotNull 
@Enumerated(EnumType.STRING) 
private CampaignState state = CampaignState.READY; 
... 

Таблица

CREATE TABLE campaign 
(
    id UUID PRIMARY KEY, 
    ... 
    state CHARACTER VARYING(64) NOT NULL, -- defined by application 
    ... 
); 

Надеюсь, это поможет.

>> Редактировать

В соответствии с вашим комментарием, пожалуйста, посмотрите на эту answer.

+0

Но вы используете varchar, а не определенный пользователем тип. –

+0

Да, при использовании varchar в таблице это работает, но я использую enum type langage, а не varchar. Thx anyway –

+0

Я вижу вашу мысль, но есть несколько вещей, о которых я мог бы упомянуть. Если у вас есть тип перечисления, определенный в базе данных и соответствующая запись в Java, у вас могут быть дублированные знания. Не хорошо для обслуживания вообще. Определив перечислимое поле с EnumType.STRING и сохраняя строковое представление, вы сохраняете знания в своем приложении. Кроме того, провайдеры JPA должны быть агрегированными в базе данных, поэтому Eclipselink позволяет сохранять значение перечисления как ординал или строку. Если вы хотите сохранить строку, varchar - это путь. В этом нет ничего плохого. – rbento

Смежные вопросы