Как сопоставить LinkedHashMap с Hibernate? - PullRequest
1 голос
/ 07 июля 2011

Я хотел бы сопоставить LinkedHashMap с Hibernate (с помощью аннотаций).

Я знаю свойство @MapKey и @IndexColumn, но могу ли я использовать оба для сопоставления связанных хэш-карт со строками основы?

Пожалуйста, не предлагайте решение, в котором я должен выводить питомца в класс и использовать список питомцев вместо LinkedHashMap (я знаю, как это сделать, но явно не хочу этого).

мой класс:

@Entity
public class Person
{
    private LinkedHashMap<String, String> pets;

    // map definition ?
    // id of the pet > name of the pet
    public LinkedHashMap<String, String> getPets()
    {
        return pets;
    }

    ...
}

Ответы [ 3 ]

3 голосов
/ 07 июля 2011

Вы можете использовать аннотацию @Lob: LinkedHashMap будет сериализован и сохранен в столбце BLOB (и десериализован при чтении из базы данных).

Но это, конечно, хрупко, невозможно запросить,вынуждает использовать Java для чтения содержимого домашних животных.

Если вам нужно более традиционное отображение на дополнительную таблицу Pet с ассоциацией «один ко многим», то вам понадобится объект Pet.

2 голосов
/ 22 декабря 2014

Просто наткнулся на это, потому что я пытаюсь изучить Hibernate (версия 3)

Я сделал что-то подобное для сортировки на стороне базы данных: вы не можете напрямую связать LinkedHasMap с Hibernate, потому чтоэто не коллекция, это реализация коллекции.

Вы можете сделать что-то вроде этого:

@ElementCollection
@JoinTable(name = "PERSON_PET", joinColumns = @JoinColumn(name = "PERSON_ID"))
@MapKeyColumn(name = "PET_KEY")
@Column(name = "PET_NAME")
@OrderBy(clause = "lower(PET_NAME) asc")
private Map<String, String> pets = new LinkedHashMap<String, String>();

Цитата из Сохранение Java с Hibernate

Можно заказать по любому столбцу таблицы сбора.Внутренне Hibernate использует LinkedHashMap, разновидность карты, которая сохраняет порядок вставки ключевых элементов.Другими словами, порядок, который Hibernate использует для добавления элементов в коллекцию во время загрузки коллекции, - это порядок итераций, который вы видите в своем приложении.То же самое можно сделать с помощью набора: Hibernate внутренне использует LinkedHashSet.В вашем Java-классе это свойство является обычным Set / HashSet, но внутренняя оболочка Hibernate с LinkedHashSet снова включена с атрибутом order-by

1 голос
/ 07 июля 2011

Вы можете использовать аннотацию @ElementCollection для отображения карты основных типов.Должно выглядеть как

    @ElementCollection(fetch=FetchType.EAGER)
    @CollectionTable(name = "person_pets", joinColumns = @JoinColumn(name = "person_id"))
    @MapKeyColumn(name = "name")
    @OrderColumn(name = "name")
    @Column(name = "pet")
    private Map<String, String> pets = new LinkedHashMap<String, String>(); 
...