2016-08-30 49 views
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; 

然而,這導致了在集合表

  1. 類型和值正確更名爲
  2. 列存儲鍵被命名爲「值」(MapKeyColumn被忽略)
  3. 存儲額外的「散列」列,其成爲主密鑰,顯然是在密鑰上撥打hashCode的結果。

有沒有辦法重新命名相應的列?

編輯 我使用Hibernate的5.2.2.Final

+0

FWIW您的代碼很好,並遵循規範說明。 MapKeyColumn應該被支持,並且實現中不應該添加額外的持久化列。作爲bug報告可能 –

+1

它已經是一個報告的bug:https://hibernate.atlassian.net/browse/HHH-8630 –

+0

真棒,感謝修復! – Mene

回答

0

注意這是及時fixed通過Steve Ebersole,它包含在休眠5.2.3。如果你被困在早期版本中,這是我作爲解決方法所做的。

我添加了一個新的Embeddable

@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()),因此可能不是你想要的。