1

PostgreSQLデータベースcurrent_statusのテーブルに列挙型フィールドがあります。history列挙は次のように定義されます。

CREATE TYPE et_status AS ENUM
   ('PENDING', 'SUCCESS', 'LATE', 'EARLY', 'FAILED', 'IN_PROGRESS', 'EXPIRED');

サーバー側で列挙型を追加し、関連するフィールドとゲッターとセッターのタイプにいくつかの変更を加えました。これは次のようになります。

@Entity
@Table(name = "history")
@XmlRootElement
@NamedQueries({ ... })
public class History implements Serializable {
    public enum StatusType implements Serializable
        {PENDING, SUCCESS, SUCCESS_LATE, SUCCESS_EARLY,
         FAILED, IN_PROGRESS, EXPIRED};

...

    @Lob
    @Column(name = "current_status")
    private StatusType currentStatus;

...

    public StatusType getCurrentStatus() {
        return currentStatus;
    }

    public void setCurrentStatus(StatusType currentStatus) {
        this.currentStatus = currentStatus;
    }
}

Webサービスをテストすると、次のエラーが発生します。

The object [PENDING], of class [class org.postgresql.util.PGobject], from mapping
[org.eclipse.persistence.mappings.DirectToFieldMapping[currentStatus-->history.current_status]]
with descriptor [RelationalDescriptor(entities.History --> [DatabaseTable(history)])],
could not be converted to [class java.lang.Integer].

インターネットを検索するとこの解決策が得られましたが、インストールに含まれていないように見えるorg.hibernate.annotations.TypeDefを使用する必要があるようです。

質問:RESTful Webサービスを介してPostgreSQL列挙型からJava列挙型に変換する適切な方法は何ですか?

データベース:PostgreSQL 8.4
アプリケーションサーバー:Glassfish 3.1.2.2
IDE:NetBeans 7.2
JDK:7アップデート7

4

1 に答える 1

1

@Lobを使用せず、代わりに@Enumerated(EnumType.STRING)を試してください。

ただし、javaの名前がpostgresqlの名前と完全に一致することを確認する必要があります(現在のコードにはありません)。

于 2012-10-15T17:12:25.600 に答える