Hibernate: сопоставление двух столбцов с ключом и значением HashMap - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть база данных с объектом, которая имеет переводы.

Есть 2 таблицы: таблица Object с id и более свойствами и таблица 'object_translation' с object_id, language(varchar) и translation (varchar)

Я хотел бы сопоставить это с

public class Object {
    private Map<Language, String> translations
}

Где язык - это перечисление в коде и строка в БД.

Возможно ли это с аннотациями?или мне нужно создать либо Collection<QuestionTranslation>, либо написать свои собственные функции отображения гибернации в DAO (я использую spring-data, поэтому я бы предпочел сохранить их красивыми и чистыми в качестве интерфейсов и аннотаций)

Версии: spring-boot 2 с предоставленным гибернацией от spring-boot-starter:

spring boot: <version>2.0.3.RELEASE</version>
<hibernate.version>5.2.17.Final</hibernate.version>
<hibernate-jpa-2.1-api.version>1.0.2.Final</hibernate-jpa-2.1-api.version>

Пока у меня есть это:

@OneToMany
@JoinTable(name = "object_translation", joinColumns = {@JoinColumn(name = "object_id", referencedColumnName = "id")})
@MapKey(name = "language")
@MapKeyEnumerated(EnumType.STRING)
private Map<Language, String> translations;

Но как мне также отобразить значение?(для пояснения: строковое значение должно быть столбцом перевода в БД)

Поскольку у меня нет первичного ключа, это должно быть теоретически возможно?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Мне удалось это исправить =)

Вы не должны использовать @OneToMany.

Что я использовал:

public class Object {

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "object_translation",
                 foreignKey = @ForeignKey(value = ConstraintMode.CONSTRAINT, name = "fk_object_translation_object"),
                 joinColumns = @JoinColumn(name = "object_id"))
    @MapKeyColumn(name = "language", nullable = false)
    @MapKeyEnumerated(EnumType.STRING)
    @Column(name = "translation", nullable = false)
    private Map<Language, String> translations;
}
0 голосов
/ 27 ноября 2018

Это недостижимо с точки зрения ORM.Невозможно указать платформе ORM для сопоставления столбца String с переводом.

Лучший способ добиться этого - получить строки из Object_Translation в виде List или Set, используя @OneToMany или @ManyToMany с mappedBy, а затемнаписать свой обычай конвертировать их в карту.

...