Теперь у нас есть одна базовая таблица, T_RESOURCE, которая содержит основную информацию о ресурсах, и некоторые другие таблицы, которые связаны с T_RESOURCE, например T_RESOURCE_TAGS, которая содержит теги ресурса в T_RESOURCE, ресурс может иметь более одного тега, это один вид этой таблицы; есть другой вид этой связи, связанный со средним классом, как T_FILES связан с T_RESOURCE с T_RESOURCE_FILES, действительно, T_RESOURCE_TAGS также является средней таблицей, но не таблица T_TAGS, как T_FILES. Всего у нас есть 11 взаимосвязей с этими двумя видами форматов (или форм). и у нас есть класс сущности для T_RESOURCE, в котором все связанные таблицы связаны чем-то вроде следующего:
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
@IndexedEmbedded(indexNullAs = Field.DEFAULT_NULL_TOKEN)
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany
@JoinTable(name="T_RESOURCE_FILES",joinColumns={ @JoinColumn(name="RESOURCE_ID", referencedColumnName="ID") },inverseJoinColumns={ @JoinColumn(name="FILE_ID", referencedColumnName="ID", unique=true) })
private List<TFILE> files;
@IndexedEmbedded(indexNullAs = Field.DEFAULT_NULL_TOKEN)
@LazyCollection(LazyCollectionOption.FALSE)
@ElementCollection
@CollectionTable(name = "T_RESOURCE_TAG", joinColumns = @JoinColumn(name = "RESOURCE_ID"))
@Column(name = "tag")
private List<String> tags;
И мы получим всю информацию о ресурсах в T_RESOURCE со всеми идентификаторами ресурсов (RESOURCE_ID), которые соответствуют критериям поиска пользователя. мы получили результаты, используя собственный запрос:
em.createNativeQuery(sql.toString(),TRESOUCE.class).setFirstResult(firstResult).setMaxResults(pageSize).getResultList();
Sql что-то вроде
"select * from T_RESOURCE where id in ('1','2','3','4') order by ..."
Это работает таким образом, но получение тегов из T_RESOURCE_TAGS, из T_RESOURCE_FILES, из других 9 отношений требует много времени, это работает следующим образом:
select * from T_RESOURCE_TAGS where asset_id = '1';
select * from T_RESOURCE_TAGS where asset_id = '2';
select * from T_RESOURCE_TAGS where asset_id = '3';
select * from T_RESOURCE_TAGS where asset_id = '4';
И, таким образом, мы обнаружим, что затраты времени увеличиваются, если больше ресурсов подходит для критериев поиска.
Я также пробовал с объединением выборки, но, похоже, есть ограничение на количество объединенных выборок, которые не работают. Я также хочу отделить эти отношения от класса TRESOUCE и попытаться получить их так же, как получить базовую информацию TRESOURCE. для информации, для средней таблицы нет уникального идентификатора для каждой записи, только resouce_id с соответствующим идентификатором/или прямым именем для файлов, тегов и т. д.
Не могли бы вы дать свои идеи, большое спасибо.
2 ответа
Некоторые БД, такие как Postgres, имеют очень полезный тип массива. Вы можете хранить теги без дополнительной таблицы внутри одной колонки. Hibernate поддерживает сопоставление пользовательских типов данных, таких как массивы, с объектами Java. Это может значительно улучшить производительность. Но массив Oracle - это другой случай - вы должны указать длину массива при создании таблицы.
Вы повышаете производительность, используя аннотацию org.hibernate.annotations.BatchSize в своей коллекции.
@Column(name = "tag")
@BatchSize(size=20)
private List<String> tags;
Приведет к выполнению следующего оператора при загрузке объекта:
select * from T_RESOURCE_TAGS where asset_id IN ('1', '2', '3', '4');
Это сэкономит несколько обращений к базе данных и ускорит ваше приложение.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.