Есть ли способ реализовать компоненты Flyweight, загружаемые из нескольких столбцов в Hibernate 5?
У меня есть денормализованные таблицы, каждая с двумя столбцами, arch_name и arch_version, которые сопоставляются с классом Archetype:
public class Archetype {
private String name;
private String version;
...
}
В настоящее время они представлены в файлах сопоставления с использованием компонента:
<hibernate-mapping>
<class name="MyEntity">
...
<component name="archetype">
<property name="name" column="arch_name" type="string"/>
<property name="version" column="arch_version" type="string"/>
</component>
...
Это позволяет такие запросы как:
select from MyEntity.class entity where entity.archetype.name = 'somearchetype';
Всего будет несколько тысяч уникальных архетипов, поэтому, чтобы избежать создания экземпляра при каждой загрузке сущности, я бы хотел вернуть их из пула.
Это не представляется возможным при использовании ComponentTuplizer, так как он создает экземпляр компонента и заполняет его в 2 этапа (intantiate () и setPropertyValues ()).
UserType или CompositeUserType выглядят так, как будто они должны работать, но, похоже, нет способа сопоставить их с <component>
и сохранить существующую поддержку запросов.
Модель данных не может быть изменена.
Мой текущий обходной путь:
- пользователь Interceptor для замены экземпляров Archetype кэшированными значениями в onLoad ()
- результаты массажа, возвращенные из Query.list (), чтобы сделать то же самое
Помимо того, что это уродливо, это приводит к тому, что создается много экземпляров Архетипа, которые затем отбрасываются.