Ответ 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 самостоятельно - просто сохраните отдельную таблицу ключей/значений с именем/значением свойства, для которого вы считаете, что поиск необходим.
Я видел количество проектов баз данных для продуктов, где необходима гибкая и динамичная (т.е. создание новых атрибутов для объектов домена без простоя), и многие из них используют таблицы ключей/значений для хранения атрибутов и ссылок домена от объектов владельца до ребенок один. Эти продукты стоят миллионы долларов (банковская/телекоммуникационная), поэтому я предполагаю, что этот проект уже доказал свою эффективность.
Извините, это не ответ на ваш оригинальный вопрос, так как вы спросили о решении без промежуточных таблиц.