PrimeFaces Lazy Load JPA


Merhaba,

PrimeFaces Datatable componentinde Lazy Load (Tembel yükleme) kelime anlamı o olabilir ama daha net anlamı aşamalı yükleme örneğin sayfalama kullanıyorsunuz ve kayıt sayınız binlerce hatta yüzbinlerce bunların birden tablonuza yüklenmesi uzun sürecek ve bir o kadar ram problemi ile karşılaşacaksınız. Bunun için Lazy Load(aşamalı yükleme) kullanmak bizim bekleme süremizi kısaltıp çalışan server üzerinde ise efektif çalışmasına olanak verecektir. Elimden geldiğince açık anlatmaya çalışacağım.

Kullandığım teknolojiler
Netbeans 8.0
JPA
Derby database
Glassfish 4.0
PrimeFaces 5.1
Maven
PrimeFaces CRUD Implemantion
JSF 2.2


1-Öncelikle Netbeans'i açıyoruz. "Project" kısmında sağ tıklayıp "New Project" ya da File->New Project i tıklıyoruz.




2-"Categories" kısmından Maven ve "Web Application" ı seçiyoruz. "Next" butonuna tıklıyoruz.



3-Bir proje ismi, Group Id,Version ve Package Name belirliyoruz ve "Next" butonuna tıklıyoruz.



4-Server ve Java EE Version'ı seçiyoruz ve "Finish" butonunu tıklıyoruz.



Projemiz oluştu. Şimdi Freamwork ekliyoruz.

5-"Project" kısmında oluşan projemizin üzerinde sağ tıklayıp "Properties" i seçiyoruz.




6-Açılan pencereden "Categories" alanından "Freamworks" seçiyoruz. Sağ taraftan "Add" butonuna tıklıyoruz. Açılan pencereden "JavaServer Faces" seçip "OK" butonuna tıklıyoruz.



7- Şimdi PrimeFaces'i eklemek için Maven Repository ekliyoruz. Buradan PrimeFaces Maven Repository adresine ulaşabilirsiniz. Projemizde "Dependencies" üzerinde sağ tıklıyoruz ve "Add Dependency..." tıklıyoruz. Açılan pencereden aşağıdaki gibi değerleri giriyoruz "Add" butonuna tıklayarak PrimeFaces.5.1.jar dosyasını projemize eklemiş oluyoruz.



Ayarlarımızı yaptıktan sonra şimdi Entitylerimizi oluşturacağız.

8-Projemizin üzerinde sağ tıklayıp New->Entity Classes From Database i tıklıyoruz. Açılan pencereden Datasource kısmından "jdbc/sample" ı seçiyoruz. "Add All" butonuna tıklayarak tüm tabloları "Selected Tables" alanına atıyoruz. Ardından "Next" butonuna tıklıyoruz.



9-Gelen pencereden "Package" kısmına uygun bir package ismi veriyoruz ve "Next" butonuna tıklıyoruz.




10-Son penceremizde "Associaton Fetch" ve "Collection Type" kısımlarını resimdeki gibi düzenleyip "Finish" butonunu tıklıyoruz.




Entitylerimizi oluşturduk şimdi ise Primefaces Implemantasyonu yapalım.

11-Projemizin üzerinde sağ tıklayıp "New->Other" seçiyoruz. Gelen pencereden "PrimeFaces CRUD Generation" ı tıklıyoruz. PrimeFaces Crud Implemantasyonu buradan nasıl yapıldığını bulabilirsiniz. "Next" butonunu tıklıyoruz.



12-Gelen pencereden sayfaları oluşturmak istediğimiz Entity Classlarını seçiyoruz.



13- Resimdeki gibi düzenleme yapılıp Finish butonunu tıklıyoruz ve bu sayede sayfaları oluşturmuş oluyoruz.



14-Şimdi projemizin üstünde sağ tıklayıp "Run" tıklayıp projeyi başlatıyoruz. Proje başarıyla çalıştıktan sonra Maintenance>Product ı tıklıyoruz. Listenin birinci sayfasında 10 satır olmasına rağmen dönen kayıt sayısı 30.

lazyload14

15-AbstractFacade.java dosyasını aşağıdaki şekilde ekleme yapacağız.
public List<T> loadLazy(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
        CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
        CriteriaQuery<T> cq = cb.createQuery(entityClass);
        Root<T> myObj = cq.from(entityClass);
        cq.where(getFilterCondition(cb, myObj, filters));
        if (sortField != null) {
            if (sortOrder.equals(SortOrder.ASCENDING)) {
                cq.orderBy(cb.asc(myObj.get(sortField)));
            } else if (sortOrder.equals(SortOrder.DESCENDING)) {
                cq.orderBy(cb.desc(myObj.get(sortField)));
            }
        }
        return getEntityManager().createQuery(cq).setFirstResult(first).setMaxResults(pageSize).getResultList();
    }

    private Predicate getFilterCondition(CriteriaBuilder cb, Root<T> root, Map<String, Object> filters) {
        Predicate filterCondition = cb.conjunction();
        String wildCard = "%";
        for (Map.Entry<String, Object> filter : filters.entrySet()) {
            String value = wildCard + filter.getValue() + wildCard;
            if (!filter.getValue().equals("")) {
                javax.persistence.criteria.Path<String> path = root.get(filter.getKey());// order.get(filter.getKey());
                filterCondition = cb.and(filterCondition, cb.like(path, value));

            }
        }
        return filterCondition;
    }

    public int count(Map<String, Object> filters) {
        CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
        CriteriaQuery<Long> cq = cb.createQuery(Long.class);
        Root<T> myObj = cq.from(entityClass);
        cq.where(getFilterCondition(cb, myObj, filters));
        cq.select(cb.count(myObj));
        return getEntityManager().createQuery(cq).getSingleResult().intValue();
    }



AbstractController.java


private LazyDataModel<T> liste;

    public LazyDataModel<T> getListe() {
        if (liste == null) {
            liste = new LazyDataModel<T>() {
                @Override
                public List<T> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
                    List<T> result = ejbFacade.loadLazy(first, pageSize, sortField, sortOrder, filters);
                    liste.setRowCount(ejbFacade.count(filters));
                    return result;
                }
            };
        }
        return liste;
    }

    public void setListe(LazyDataModel<T> liste) {
        this.liste = liste;
    }



Product List.xhtml
<p:dataTable id="datalist"
             value="#{productController.liste}"
             var="item"
             rowKey="#{item.productId}"
             paginator="true"
             rows="10"
             rowsPerPageTemplate="10,20,30,40,50"
             selectionMode="single"
             selection="#{productController.selected}"
             lazy="true">



Sonuç:




Projeyi buradan indirebilirsiniz.

Elimden geldiğince anlatmaya çalıştım.

Sorunsuz javalı günler :)

Yorum Gönder

0 Yorumlar