1
注意这是及时的fixedSteve Ebersole,它包含在Hibernate 5.2.3中。如果您遇到早期版本问题,我会添加一个解决方法作为答案。重命名ElementCollection中的嵌入数据
我有以下工作设置:
的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
FWIW您的代码很好,并遵循规范说明。 MapKeyColumn应该被支持,并且实现中不应该添加额外的持久化列。作为bug报告可能 –
它已经是一个报告的bug:https://hibernate.atlassian.net/browse/HHH-8630 –
真棒,感谢修复! – Mene