3

<name, value>基本的にペアであるプロパティのマップを含むクラスで Hibernate アノテーションを使用しています。プロパティ名は で定義され、PROPERTY enum各プロパティには許容値のセットがあり、 としても定義されていenumます。各プロパティには独自のenum値が定義されているため、プロパティ マップは次のように定義されます。

Map<PROPERTY, Enum> properties = new EnumMap<PROPERTY, Enum> (PROPERTY.class);

値のマッピングに問題がありEnumます。この定義:

@ElementCollection
@MapKeyEnumerated(EnumType.STRING)
@MapKeyColumn(name="name")
@Column(name="value")
@Enumerated(EnumType.STRING)
Map<PROPERTY, Enum> properties = new EnumMap<PROPERTY, Enum> (PROPERTY.class);

次の DDL を生成します。

create table EnumMapTest (
    id bigint not null auto_increment,
    primary key (id)
) ENGINE=InnoDB;

create table EnumMapTest_properties (
    EnumMapTest_id bigint not null,
    value tinyblob,
    name varchar(255) not null,
    primary key (EnumMapTest_id, name)
) ENGINE=InnoDB;

ご覧のとおり、Enum クラスは としてマッピングされておりtinyblob、データベースではまったく読み取ることができません。

コンクリートでマップを定義するとenum

enum VALUE {ONE, TWO, THREE};

@ElementCollection
@MapKeyEnumerated(EnumType.STRING)
@MapKeyColumn(name="name")
@Column(name="value")
@Enumerated(EnumType.STRING)
Map<PROPERTY, VALUE> properties = new EnumMap<PROPERTY, VALUE> (PROPERTY.class);

マッピングは問題ありません:

create table EnumMapTest_properties (
    EnumMapTest_id bigint not null,
    value varchar(255),
    name varchar(255) not null,
    primary key (EnumMapTest_id, name)
) ENGINE=InnoDB;

したがって、問題はEnumクラス自体のマッピングです。

カスタム型を作成せずに、列挙型を読み取り可能なもの (できれば文字列) にマップする方法はありますか?

まだ Hibernate 3.6.10 であるという事実が、私たちに不利にならないことを願っています。

あらゆる支援のためのTIA

4

1 に答える 1