我想在实体 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”中使用枚举,它工作正常。此代码在 Wildfly 8.1 上运行,带有 Postgres 9.3 和 Java 1.7
我希望我清楚地声明了我的问题,任何人都可以帮助我。
更新
这是一个小型项目存储库的链接 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 种不同方法。如果我将 createQuery(..) 方法与 setParameter(..) 方法一起使用,则会引发我描述的异常。这是在评论中。
如果我使用 createNativeQuery 方法,我会得到结果列表并且不会引发异常。但在那之后,我在类 TestServlet 中得到了一个 ClassCastException。