2012-06-05 2 views
2

내가 JPA (EclipseLink가 구현) 먼저 시도를하고와 포스트 그레스 열거에 열거하고 꽤 붙어 느낌 : PostgreSQL의에서매핑 자바는 EclipseLink

내가 꽤 잘 다음 DB 스키마

CREATE TYPE mood AS ENUM ('sad', 'happy', 'enthusiastic'); 

CREATE TABLE person (
    pk  BIGINT PRIMARY KEY, 
    name VARCHAR NOT NULL, 
    mood mood  NOT NULL 
); 

CREATE SEQUENCE person_pk_seq INCREMENT BY 100 MINVALUE 100; 

작동이있는

:이 삽입 INSERT INTO PERSON (PK, mood, name) VALUES (3, 'happy', 'Joe')가 (. 문자열 차이가 없습니다으로 PK를 커밋)를 JPA 측면에서

같이, 나는 다음과 같은 클래스를 썼다 84,449,769,

그러나,이 예제가 작동하지 않습니다와 나는 문제가 무엇인지 단서가 없다 :

[EL Warning]: 2012-06-05 15:28:20.646--UnitOfWork(845463623)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.BatchUpdateException: Batch-Eintrag 0 INSERT INTO PERSON (PK, mood, name) VALUES ('801', 'enthusiastic', 'Joe') wurde abgebrochen. Rufen Sie 'getNextException' auf, um die Ursache zu erfahren. 
Error Code: 0 
Call: INSERT INTO PERSON (PK, mood, name) VALUES (?, ?, ?) 
    bind => [3 parameters bound] 

나는 varchar에 테이블 person의 열 유형을 변경하고 @Convert@ObjectTypeConverter 모든대로 작동 주석을 제거하면 예상했다.

아이디어가 있으십니까?

답변

3

@ObjectTypeConverter을 사용하는 이유는 here과 같이 일식 링크를 사용하여 열거 형을 표시 할 수 있습니다. @Enumerated은 JSR-220의 일부이며 @ObjectTypeConverterEclipseLink JPA Extensions의 독점 확장입니다.

@Enumerated(EnumType.STRING) 
@Column(name = "mood") 
private Mood mood; 
+0

이것은 구현입니다. 현재 사용하고 있습니다. 그러나 이렇게하려면 'mood' 열이 varchar/text/String 유형이어야합니다. – Beasterfield

+0

postgresql에서 열거 형을 String으로 나타내는 데는 아무런 문제가 없습니다. – zellus

+0

enum-types를 사용하면 char 유형 에서처럼 선택/결합이 더 빨라지 길 바래요. – Beasterfield

0

변환기 설정을 무시할 수 있으므로 @Enumerated (EnumType.STRING)를 제거해보십시오.

+0

불행히도, 이것은 차이가 없습니다. – Beasterfield

0

기분 유형이란 무엇입니까? 이것은 표준 JDBC 유형이 아니기 때문에 이것이 오류의 원인입니다.

Postgres는이 유형을 JDBC를 통해 바인딩해야합니까? 그것은 varchar 값을 자동으로 변환하지 않는 것이 이상하게 보입니다. 조금보고,이 형식을 PGObject로 반환하는 것으로 보이므로 Java 열거 형과 Postgres 열거 형간에 변환하는 사용자 지정 변환기가 있어야합니다. 변환기 초기화 메소드의 DatabaseField에있는 jdbcType을 OTHER로 설정해야합니다.

이 유형의 Postgres 플랫폼에 지원을 추가하려면 EclipseLink에 버그를 기록하십시오.

매개 변수 바인딩을 사용하지 않도록 설정하는 것도 효과가 있다고 생각합니다.

+0

사용자 정의 열거입니다. 기본적으로 자바 'enum'과 동일하지만 데이터베이스 측에 있습니다. 그래서 내 질문은 실제로 사용자 정의 된 Java enum에이 사용자 정의 데이터베이스 유형을 매핑하는 방법입니다. 기본적으로이 질문과 동일 http://stackoverflow.com/questions/851758/java-enums-jpa-and-postgres-enums-how-do-i-make-them-work-together 대신 Eclipse/Link를 사용합니다. 최대 절전 모드. 나는 이미'Converter'-Interface를 발견했지만 그것을 구현하는 방법을 정말로 이해하지 못했습니다. – Beasterfield

+0

변환기가 필요하지 않습니다. 예제는 약간 구식입니다. – zellus

+0

변환기를 사용하려면 자신의 변환기 클래스를 구현해야합니다. 먼저 데이터베이스가 반환하는 값을 출력 한 다음 시작하여 그 값으로 변환해야합니다. – James