我想在实体 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 中,您可以看到两种不同的创建查询的方法。如果我将 createQuery(..) 方法与 setParameter(..) 方法一起使用,则会抛出我描述的异常。这是在评论中。
如果我使用 createNativeQuery 方法,我会得到结果列表并且不会抛出异常。但在那之后我在类 TestServlet 中得到了一个 ClassCastException。
最佳答案
问题是默认情况下,枚举使用 oridinal 作为 int 持久化。您必须通过在枚举字段上添加 @Enumerated(EnumType.STRING)
将其更改为字符串表示形式。还要检查在您的主要实体中您是否注释了字段而不是 getter/setter,以便它打开实体以及嵌入式实体(在本例中为 EmbeddedFoo)的 FIELD 访问。因此,如果您在 EmbeddedFoo 字段而不是 getter 中进行注释,它将正常工作。
@Embeddable
public class EmbeddedFoo implements Serializable
{
public static enum EnumBar {
VALUEA,VALUEB
}
@Enumerated(EnumType.STRING)
private EnumBar enumBar;
public EnumBar getEnumBar()
{
return enumBar;
}
public void setEnumBar(final EnumBar enumBar)
{
this.enumBar = enumBar;
}
}
此外,如果您出于某种原因必须在 getter 上进行注解,则必须通过 @Access(AccessType.PROPERTY) 对 EmbeddedFoo 进行注解,这也会解决您的问题。
@Embeddable
@Access(AccessType.PROPERTY)
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;
}
}
关于java - Wildfly - 在可嵌入 bean 中使用枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25121558/