エンティティ Bean で列挙型を使用したい。しかし、列挙型は埋め込みオブジェクトにあります。コードがあります:
@Entity
@Table(name = "entity_foo")
public class EntityFoo implements Serializable
{
@Embedded
private EmbeddedFoo embeddedFoo;
public EmbeddedFoo getEmbeddedFoo()
{
return embeddedFoo;
}
public void setEmbeddedFoo(final EmbeddedFoo embeddedFoo)
{
this.embeddedFoo = embeddedFoo;
}
}
私の埋め込みオブジェクトには列挙型が含まれており、次のようになります。
@Embeddable
public class EmbeddedFoo implements Serializable
{
public static enum EnumBar {
VALUEA,VALUEB
}
private EnumBar enumBar;
@Enumerated(EnumType.STRING)
public EnumBar getEnumBar()
{
return enumBar;
}
public void setEnumBar(final EnumBar enumBar)
{
this.enumBar = enumBar;
}
}
テーブル entity_foo で、値 enumbar を varchar(255) として宣言しました。今、データベースからデータを取得しようとしています。
final List<EntityFoo> entityFoos = query.getResultList();
これにより、PSQLException がスローされます。
Caused by: org.postgresql.util.PSQLException: Bad value for type int : VALUEA
エンティティ「EntityFoo」で列挙型を直接使用すると、正常に動作します。このコードは、Postgres 9.3 および Java 1.7 を使用する Wildfly 8.1 で実行されます。
私の問題を明確に宣言し、誰かが私を助けてくれることを願っています。
アップデート
ミニプロジェクト リポジトリへのリンクは次のとおりです https://github.com/MotherCake/miniprojct
このプロジェクトを使用するには、テーブルが必要です。これが作成ステートメントです。
CREATE TABLE "public"."minitable"(id int PRIMARY KEY NOT NULL,enumbar varchar(255));
CREATE UNIQUE INDEX minitable_pkey ON "public"."minitable"(id);
INSERT INTO minitable (id,enumbar) VALUES (0,'VALUEA');
INSERT INTO minitable (id,enumbar) VALUES (1,'VALUEB');
私が言及するのを忘れていたのは、Toplink を使用していることです。Toplink が問題を引き起こしていると思います。
クラス Testservlet では、クエリを作成する 2 つの異なる方法を見ることができます。setParameter(..) メソッドで createQuery(..) メソッドを使用すると、説明した例外がスローされます。これはコメントにあります。
メソッド createNativeQuery を使用している場合、結果リストが取得され、例外はスローされません。しかしその後、クラス TestServlet で ClassCastException を取得します。