在ElementCollection中重命名嵌入数据

时间:2016-08-30 16:05:57

标签: hibernate jpa

注意这是fixedSteve 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;

然而,这会导致

  1. 集合表中的类型和值已正确重命名
  2. 存储密钥的列名为&#34; value&#34; (MapKeyColumn被忽略)
  3. 另一个&#34;哈希&#34;列存储,它成为主键的一部分,显然是在键上调用hashCode的结果。
  4. 有没有办法相应地重命名列?

    修改 我正在使用Hibernate 5.2.2.Final

1 个答案:

答案 0 :(得分:0)

注意这是fixedSteve 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),因此可能不是您想要的。