2016-08-30 3 views
1

Примечание Это было незамедлительно fixed от Steve Ebersole, оно включено в Hibernate 5.2.3. Если вы застряли в более ранних версиях, я добавлю обходной путь в качестве ответа.Переименование Встроенные данные в ElementCollection

У меня есть следующие рабочие настройки:

An 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 должен поддерживаться, и не должно быть никаких дополнительных повторяющихся столбцов, добавленных в реализацию. Сообщить об ошибке, возможно, –

+1

Это уже зарегистрированная ошибка: https://hibernate.atlassian.net/browse/HHH-8630 –

+0

Удивительно, спасибо за исправление! – Mene

ответ

0

Примечание это было быстро fixed по Steve Ebersole, он включен в Hibernate 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()) и, возможно, это не так, как вы хотите.

Смежные вопросы