2

エンティティ 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 を取得します。

4

2 に答える 2

0

プロジェクトを機能させるための解決策を見つけましたが、なぜこれが必要なのかわかりません。Jakub が書いたように、@Enumerated(EnumType.STRING)を追加するだけで十分だと思いました。

変数 enumBar に @Column(name = "enumbar") という注釈を付けました。

@Column(name = "enumbar")
@Enumerated(EnumType.STRING)
public EnumBar enumBar;

さらに、EntityFoo の埋め込みオブジェクトに @AtributeOverride アノテーションを追加します。

@Embedded
@AttributeOverride(name = "enumBar", column = @Column(name = "enumbar"))
private EmbeddedFoo embeddedFoo;

その後、それは魅力のように機能します。

試してみたい人のために、github でプロジェクトを更新します。

手伝ってくれてありがとう。

于 2014-08-07T11:54:56.970 に答える