2012-06-11 5 views
1

Мне нужно отобразить большой стол с примерно 1300 ролями за один раз. (Я знаю, что я должен использовать прокрутку данных, но мои пользователи хотят видеть всю таблицу за один раз.) В таблице отображаются 4 столбца. Два из этих столбцов относятся к объекту, а два других относятся к объектам, включенным в исходный объект. Мне нужно найти лучший/эффективный способ сделать это. В настоящее время у меня это работает, но когда я перезагружаю таблицу, она выдает ошибку из памяти. Я думаю, что это вызвано большим количеством избыточных данных в памяти.JPA и JSF Datatable Optimization

  1. Создайте объект вида, в котором репозиторий будет заполняться только необходимыми полями.
  2. Любые другие предложения.

Вот объекты:

public class Database extends EntityObject { 
     private Long id; 
     private String name; 
     private String connectionString; 
     private String username; 
     private String password; 
     private String description; 

     // getter and setters omitted 
    } 

    public class Application extends EntityObject { 
     private Long id; 
     private String name; 
     private String fullName = ""; 
     private String description; 
     private Database database; 
     private List<Role> roles = new ArrayList<Role>(0); 

     // getter and setters omitted 
    } 

    public class Role extends EntityObject { 
     private Long id; 
     private String name; 
     private String nameOnDatabase; 
     private Application application; 

     // getter and setters omitted 
    } 

Что нужно отображается в списке ролей:

role.id, role.name, role.application.name, role.application .database.name

ответ

1

Чтобы оптимизировать разумно, определите, что вы собираетесь делать с данными, просматривать и/или редактировать. Вот некоторые общие сценарии:

  1. Retrieval using lazy fetch type. Отметьте свои роли в приложении с помощью аннотации FetchType.LAZY.

  2. Retrieval using multiselect query. Создайте свой собственный класс (например, DTO) и заполните его данными из базы данных, используя запрос multiselect. (По аналогии с видом на карту, как Entity)

Есть также другие возможности, такие как Shared (L2) Entity Cache или Retrieval by Refresh.

Проверьте, если вы используете EntityManager правильно чтение Am I supposed to call EntityManager.clear() often to avoid memory leaks?.

+0

Зачем OP нужен ленивый груз? Загружаем «Роль», «Приложение» и «База данных». – siebz0r

+0

Retrieved Role будет загружать приложение, которое будет загружать List с нетерпением. Поскольку вы извлекаете все роли из базы данных, я не уверен, будет ли спящий режим автоматически искать уже полученные роли в контексте персистентности. – JMelnik

+0

коллекции, как мне известно, были ленивыми по умолчанию. – siebz0r