3

我在一个包含属性映射的类中使用 Hibernate 注释,这些属性基本上是<name, value>成对的。属性名称在 a 中定义PROPERTY enum,每个属性都有一组允许值,也定义为 a 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 提供任何帮助

4

1 回答 1

1

如果你没有指定任何类型,hibernate 会使用序列化来保存它。这就是为什么它会生成一个 tinyblob。

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

于 2013-05-02T16:19:11.927 回答