Есть ли лучший способ сохранить карту со значением, являющимся набором?

Мне очень нравится использовать Hibernate для сохранения карты типа Map<String, Set<Entity>> с небольшой удачей (тем более, что я хочу, чтобы все это было на одной таблице).

Отображение MultiMaps с Hibernate - это то, что, кажется, больше всего ссылается, в котором подробно описывается, как это реализовать при использовании UserCollectionType.

Мне было интересно, так как это было написано более четырех лет назад, есть ли лучший способ сделать это сейчас?

Итак, например, я хотел бы иметь на EntityA такую ​​карту, как Map<String, Set/List<EntityB>>.

Было бы две таблицы: EntityA и EntityBEntityB с внешним ключом на EntityA).

Мне не нужны промежуточные таблицы.

Ответ 1

Как это делается в моем текущем проекте, мы преобразуем beans/collections в xml с помощью xstream:

public static String toXML(Object instance) {
    XStream xs = new XStream();
    StringWriter writer = new StringWriter();
    xs.marshal(instance, new CompactWriter(writer));
    return writer.toString();
}

а затем используя тип Lob в спящем режиме для сохранения:

@Lob
@Column(nullable = false)
private String data;

Я нашел этот подход очень универсальным, и вы могли бы эффективно реализовать с ним гибкое хранилище ключей/значений. Вам не нравится формат XML, тогда в инфраструктуре Xstream встроен драйвер для преобразования объектов в JSON. Попробуйте, это действительно здорово.

Приветствия

EDIT: ответ на комментарий. Да, если вы хотите преодолеть ограничения классического подхода, вы, вероятно, жертвуете чем-то вроде индексации и/или поиска. Вы можете реализовать индексирование/поиск/внешние/дочерние отношения через коллекции/общий объект beans самостоятельно - просто сохраните отдельную таблицу ключей/значений с именем/значением свойства, для которого вы считаете, что поиск необходим.

Я видел количество проектов баз данных для продуктов, где необходима гибкая и динамичная (т.е. создание новых атрибутов для объектов домена без простоя), и многие из них используют таблицы ключей/значений для хранения атрибутов и ссылок домена от объектов владельца до ребенок один. Эти продукты стоят миллионы долларов (банковская/телекоммуникационная), поэтому я предполагаю, что этот проект уже доказал свою эффективность.

Извините, это не ответ на ваш оригинальный вопрос, так как вы спросили о решении без промежуточных таблиц.

Ответ 2

Это зависит:) Когда все становится сложным, вы должны понимать, что делает ваше приложение.

В некоторой ситуации вы можете представить свой Set как TreeSet и представить этот TreeSet в упорядоченной кодированной строке, например [ "1", "8", "12" ], где 1, 8, 12 являются первичными ключами, а затем напишите код!

Очевидно, это не общий ответ, на мой взгляд, слишком общий вопрос.