java - Wildfly - 在可嵌入 bean 中使用枚举

标签 java enums toplink wildfly-8

我想在实体 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/

相关文章:

java - 更好地扩展一个类或直接修改它?

java - 如何以编程方式获取 Camera RAW 元数据信息 Android

c++ - 在 C++ 中使用类和枚举

magento - 如何在magento的页脚显示顶部链接?

java - 如何在线托管使用 jpa toplink、tomcat7 mysql 和 primefaces 创建的 java web 动态项目

java - 为什么在序列化内置类型时会忽略 JsonAdapter 注解?

java - 递归计算数组的标准差

c++ - 从另一个文件调用一个函数到另一个函数C++

ios - 如何比较同一个 Swift 枚举的不同实例?

java - 什么时候使用 Hibernate/JPA/Toplink?