Использование 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?

какую альтернативу можете предложить?

Я предпочитаю не мешать в одну кучу веб и работу с базой. Ejb плюс vaadin вебморда.

тогда поделитесь опытом как Вы используете ленивую подгрузку сущностей?

Во-первых реализовать бизнес методы для погрузки сущностей. Поищите на форуме lazy container или мои сообщения.

Есть ли новости о 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 в то же время работает именно как нужно, никаких лишних запросов.
Я вообще с трудом понимаю, для чего в принципе нужны единичные запросы? Это очевидное убийство производительности.