Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Wildfly-在可嵌入bean中使用枚举_Java_Enums_Toplink_Wildfly 8 - Fatal编程技术网

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

Java Wildfly-在可嵌入bean中使用枚举,java,enums,toplink,wildfly-8,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; } publ

我想在实体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;
    }
}
在表实体_foo中,我将值enumbar声明为varchar(255)。现在我尝试从数据库中获取数据

final List<EntityFoo> entityFoos = query.getResultList();
如果我在实体“EntityFoo”中直接使用枚举,它就可以正常工作。此代码在带有Postgres 9.3和Java 1.7的Wildfly 8.1上运行

我希望我清楚地说明了我的问题,任何人都能帮助我

更新

以下是指向小型项目存储库的链接

要使用此项目,您需要一个表。下面是create语句

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)上的字段访问。所以,如果您在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;
    }
}

我找到了一个解决方案让项目工作,但我不知道为什么这是必要的。 正如Jakub所写,我认为添加@Enumerated(EnumType.STRING)就足够了

我用@Column(name=“enumBar”)注释了变量enumBar

此外,我将@AtributeOverride注释添加到EntityFoo中的嵌入对象中

@Embedded
@AttributeOverride(name = "enumBar", column = @Column(name = "enumbar"))
private EmbeddedFoo embeddedFoo;
在那之后,它就像魅力一样

我在github上为每个想尝试的人更新项目


谢谢你的帮助。

谢谢你的提示。我已经将其标记为字符串,但忘记发布。我改进了我的帖子。我认为数据库中的类型仍然不正确。在数据库中,列enumbar被声明为varchar。这不对吗?我想再次指出,如果我直接在实体Bean中使用enum,它是有效的。您可以将项目上传到某个地方吗?我已经检查过了,您的代码现在运行正常。我为一个小型项目创建了一个存储库。我更新的帖子中有一些描述的链接
@Column(name = "enumbar")
@Enumerated(EnumType.STRING)
public EnumBar enumBar;
@Embedded
@AttributeOverride(name = "enumBar", column = @Column(name = "enumbar"))
private EmbeddedFoo embeddedFoo;