Important Notice - Forums is archived
To simplify things and help our users to be more productive, we have archived the current forum and focus our efforts on helping developers on Stack Overflow. You can post new questions on Stack Overflow or join our Discord channel.

Vaadin lets you build secure, UX-first PWAs entirely in Java.
Free ebook & tutorial.
Использование JPA Container
Добрый день!
Использую базу данных Postgre SQL, фреймворк Vaadin и add-on Jpa Container для связи Vaadin и Hibernate. При использовании возникает такая проблема: при отображении таблицы из в базы в таблицу на интерфейсе через контейнер, hibernate делает для каждой записи отдельный запрос.в результате, если у меня например 500 записей, то будет сделано 500 запросов к базе. В результате чего страницы грузятся очень долго. Если использовать SQL контейнер или Hbn container, то проблемы такой не возникает.
Вот код создания контейнера и назначения его таблице:
JPAContainer<Person> container = JPAContainerFactory.make(Person.class,
"persistence-unit");
table.setContainerDataSource(container);
Файл persistemce.xml:
<persistence-unit name="persistence-unit" transaction-type="RESOURCE_LOCAL">
<jta-data-source>java:jboss/datasources/mfc-frontendDS</jta-data-source>
<properties>
<!-- Properties for Hibernate -->
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
</properties>
</persistence-unit>
Подскажите, что я делаю не так? Уже не первый день борюсь с этой проблемой, однако на ум ничего не приходит...
Зачем вообще использовать такой тяжёлый контейнер как JpaContainer?
Andris Lapinsh: Зачем вообще использовать такой тяжёлый контейнер как JpaContainer?
какую альтернативу можете предложить?
Я предпочитаю не мешать в одну кучу веб и работу с базой. Ejb плюс vaadin вебморда.
Andris Lapinsh: Я предпочитаю не мешать в одну кучу веб и работу с базой. Ejb плюс vaadin вебморда.
тогда поделитесь опытом как Вы используете ленивую подгрузку сущностей?
Во-первых реализовать бизнес методы для погрузки сущностей. Поищите на форуме lazy container или мои сообщения.
Есть ли новости о JPA Container'е.
Проблема осталась и по сей день, Vaadin v7.3.0.
И делает JPA Container ненужной поделкой. Что обидно, ведь идея верная.
Roman Smirnov: Есть ли новости о JPA Container'е.
Проблема осталась и по сей день, Vaadin v7.3.0.
И делает JPA Container ненужной поделкой. Что обидно, ведь идея верная.
хотите сказать что он грузит сразу всю таблицу из бд? я использую eclipselink, и он грузит ровно по 150 записей единожды, если выставить уровень логгирования fine, то можно это увидеть. протестировал на разных количествах записей, все ок. начальная загрузка всегда медленная при любом количестве, дальше работает нормально
Нет. Именно как в описании:
> при отображении таблицы из в базы в таблицу на интерфейсе через контейнер, hibernate делает для каждой записи отдельный запрос.
Т.е. ненужные единичные запросы к БД идут
- для каждой видимой записи при начальной загрузке
- при изменении положения курсора (select blah where rowid = 123)
Ещё раз подробнее. Используются EclipseLink и Oracle.
Порядок запросов следующий
- select fields from table limit 75 (там не limit, a оракловский синтаксис с rowid, наизусть не помню. 75 - видимый размер страницы в таблице)
- 75 штук select fields from table where rowid = 0..74
- при смене положения курсора select fields from table where rowid = new_cursor_item_id
Правильным было бы ограничиться первым запросом на 75 записей, остальные решительно не нужны. Число 75 здесь для примера. Можно изменить размер таблицы отображения и это число соответственно изменится.
LazyQueryContainer в то же время работает именно как нужно, никаких лишних запросов.
Я вообще с трудом понимаю, для чего в принципе нужны единичные запросы? Это очевидное убийство производительности.