我在包含属性映射的类中使用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
答案 0 :(得分:1)
如果你没有指定任何类型,hibernate会使用序列化来保存它。这就是它产生一个小小的原因。
在您的情况下,我建议您制作字符串映射(Map<PROPERTY, String>
),因为您只使用枚举值。你必须手动将枚举转换为字符串(enum-class name和enum-name的组合),但它是可读的。