如何在hibernate中用Enum作为值注释一个EnumMap



我在包含属性映射的类中使用Hibernate注释,这些属性基本上是<name, value>对。属性名称在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类本身的映射。

是否有一种方法可以将Enum映射到可读的东西(最好是字符串)而无需创建自定义类型?

我希望我们还在Hibernate 3.6.10的事实不会成为我们的障碍。

TIA提供任何帮助

如果您没有指定任何类型,hibernate将使用序列化保存它。这就是它生成一个tinyblob的原因。

在你的情况下,我建议你做一个字符串的映射(Map<PROPERTY, String>),因为你只是使用Enum值。您必须手动将枚举转换为字符串(枚举类名和枚举名的组合),但它是可读的。

最新更新