注意这是fixed的Steve Ebersole,它包含在Hibernate 5.2.3中。如果您仍然坚持使用早期版本,我会添加一个解决方法作为答案。
我有以下工作设置:
Embeddable
(为了便于阅读,删除了样板)
@Embeddable
public class TypeValue {
String type;
@Column(columnDefinition = "TEXT")
String value;
}
并Entity
(为了便于阅读而删除了样板文件)
@Entity
public class AggregatedTypeValue {
@Id
UUID id;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "type", column = @Column(name = "content_type")),
@AttributeOverride(name = "value", column = @Column(name = "content_value"))
})
TypeValue content;
@ElementCollection(fetch = FetchType.EAGER)
@MapKeyColumn(name = "attribute_name")
Map<String, TypeValue> attributes;
}
如您所见,我使用MapKeyColumn
重命名存储地图键的列。这样可以正常工作。但是,我还想重命名用于Embaddable
的列。
根据我的发现,这应该可以使用AttributeOverride
:
@ElementCollection(fetch = FetchType.EAGER)
@AttributeOverrides({
@AttributeOverride(name = "value.type", column = @Column(name = "attribute_type")),
@AttributeOverride(name = "value.value", column = @Column(name = "attribute_value"))
})
@MapKeyColumn(name = "attribute_name")
Map<String, TypeValue> attributes;
然而,这会导致
MapKeyColumn
被忽略)hashCode
的结果。有没有办法相应地重命名列?
修改 我正在使用Hibernate 5.2.2.Final
答案 0 :(得分:0)
注意这是fixed的Steve Ebersole,它包含在Hibernate 5.2.3中。如果您仍然坚持使用早期版本,请参阅我的解决方法。
我添加了新的@Embeddable
public class AttributeName {
String name;
}
@ElementCollection(fetch = FetchType.LAZY)
@AttributeOverrides({
@AttributeOverride(name = "key.name", column = @Column(name = "attribute_name", nullable = false)),
@AttributeOverride(name = "value.type", column = @Column(name = "attribute_type", nullable = false)),
@AttributeOverride(name = "value.value", column = @Column(name = "attribute_value", nullable = false))
})
Map<AttributeName, TypeValue> attributes;
并将其用作关键:
key.getName()
这可以按预期工作,但这也意味着您必须以不同方式访问实际密钥(例如node-red
),因此可能不是您想要的。