Selamlar,

Ejb ile kurumsal bir proje geliştiriyoruz. Jpa de @OneToMany ilişkilerde karşılaştığımız sorunlar var. Sizinde fikirlerinizi almak istiyorum. Mimaride EJB ile Clint aynı pakette (EAR) olmasına rağmen Remote Interface şablonu tasarlanmış. Yani EJB lere remote interface üzerinden erişiliyor. Bunun bizim proje için çok doğru bir şablon olmadığını az çok biliyorum. Ve karşılaştığım sorunlarda bu şablonun etkisininde olduğunu düşünüyorum.

  • Jpa version : 2.1
  • ORM : EclipseLink 2.5
  • Application Server : WebLogic 12

Örnek olarak Policy entitysinde

@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy = "policy", orphanRemoval = true)
private List<Indendity> indendityList;

Şu şekilde bir ilişki tutuluyor. İlişkiden de göreceğiniz üzere FetchType.LAZY.

Remote Interface :

Policy objesini id ile sorguladığım zaman debugda indendityList paketini Inspect ettiğimde "indirectlist not instantiated " olarak görüyorum.

Bunun çözümü olarak 2-3 senaryo var.

örneğin Servisten dönmeden önce indendityList.size() method ile yada JPQL de indendityList i JOIN FETCH ederek listeyi alabiliyorum.

Yukarıdaki çözümleri kullanmadan client tarafında listeyi almam mümkün olmuyor. Her ilişkide .size() foksiyonun çağırılmasının çok doğru olmadığını düşünüyorum.

Servisten dönen objenin ilişkilerinin (örn : indendityList in) get metodunu çağırdığımda o an ilgili ilişkinin yüklenmesi gerekmez mi ? Yoksa FetchType.LAZY olarak tutulan her bir ilişki için ayrı ayrı servis yazılıp öylemi çekilmesi gerekir.

Locale Interface :

Diğer bir senaryoda ilişki şu şekilde tepki veriyor.

Remote EJB leri weblogic-ejb-jar.xml de ilgili servisi

     <weblogic-enterprise-bean>
    <ejb-name>policyService</ejb-name>
    <enable-call-by-reference>True</enable-call-by-reference>
</weblogic-enterprise-bean>

Locale çektiğimde servisten dönen Policy objesinin ilişkileri "indirectlist not instantiated " olarak dönüyor fakat ilişkileri get Metod ları ile çağırdığımda bu sefer ilişkiler yükleniyor.

Bu durum esasında normal çalışması gerektiği gibi çalışıyor.

Fakat remote tasarımı üzerinden verileri çektiğimde "indirectlist not instantiated" senaryosunu nasıl aşabilirim. Bu konuda düşüncelerinizi paylaşmanızı rica ediyorum.

soruldu: 03 Tem '15, 09:07

OPTIMUS's gravatar image

OPTIMUS
25224
cevap kabul oranı: 0%


Remote tanimlanmis Service'ler Local Service'lerden farkli calisir. Locale Service metodlarinda islem yaparken Get yaptiginizda zaten acik olan bir Transaction icinde islemler yaptiginiz icin Lazy tanimlanmis objeleri hata olmadan alirsiniz. Fakat Remote Service'lerde siz uzaktaki bir Service uzerinden cagri yapiyorsunuz, o Service kendi Transaction'ini baslatiyor, size sonucu donderiyor ve Transaction'i kapaniyor, size gelen sonuc uzerinde Lazy tanimlanmis objelere ulasma sansiniz yok! (eger Remote Service'de size(), get for each veya paging benzeri islemler yapmadiysaniz).

Service kodlarinizi ve proje yapinizi gormeden kesin cevap vermek zor fakat olasi cozumler:

  1. DTO (Data Transfer Object) kullanarak Remote Service uzerinden sonuclari entity degil de DTO olarak alip islemler yapip tekrar DTO yollayarak Remote islemler yapmak. Eger Remote Service'lerin yapisina mudahale sansiniz yoksa zor bir secenek. Eger bir Java EE projeniz varsa ve bu proje ile kullanilan bir Rich Client (JavaFX, Java Swing vb. gibi) projeniz varsa RMI uzerinden enterprise projeye ulasiyorsaniz DTO uygun bir cozum.

  2. Remote Service'leri degistirebilme sansiniz varsa direk Restful Web Service'leri kullanin, Client JSON ile haberlessin boylece Client projesinde Restful yapi kullanarak islemler yaparsiniz. Unirest for Java ile bu haberlesmeyi cok basitlestirebilirsiniz.

  3. Sizin yukaridaki get ve size() cozumleriniz milyonlarca kayit olan iliskilerde sorun olur, illa yapi Remote Service ve Lazy Loading islemleri ile cozulmesi gerekiyorsa iliskili listeler icin Service metodlari yazin boylece iliskili listeleri ayri ayri sorun olmadan paging yaparak alin. Hatta bunu bir kez Generic Abstract Service yazarak her entity icin kullanabilirsiniz. Asagidaki ornek kodlarda getListWithNamedQuery() NamedQuery verilen bir entity icin paging yapilarak liste aliniyor, biraz daha gelistirip kendi yapiniza uygun kullanabilirsiniz.

Kolay gelsin.


/**
 * Abstract Service.
 *
 * @param <t> base entity
 *
 * @author Cem Ikta
 */
public abstract class AbstractService<t extends="" baseentity=""> {

@Inject
    private EntityManager entityManager;

private final Class<t> entityClass;

/**
     * Create default service
     *
     * @param entityClass entity class
     */
    public AbstractService(Class<t> entityClass) {
        this.entityClass = entityClass;
    }

/**
     * Gets injected entity manager.
     *
     * @return entity manager
     */
    public EntityManager getEntityManager() {
        return entityManager;
    }

/**
     * Gets entity class.
     *
     * @return entity class
     */
    public Class<t> getEntityClass() {
        return entityClass;
    }

/**
     * Gets entity list with named query.
     *
     * @param namedQueryName named query name from entity
     * @param start start position
     * @param end end position
     * @return result list
     */
    @Transactional
    @SuppressWarnings("unchecked")
    public List<t> getListWithNamedQuery(String namedQueryName, int start, int end) {
        Query query = getEntityManager().createNamedQuery(namedQueryName);
        query.setMaxResults(end - start);
        query.setFirstResult(start);
        return query.getResultList();
    }

// diger metodlar ...

permanent link

cevaplandı: 06 Tem '15, 19:45

CemIkta's gravatar image

CemIkta ♦
19.9k29125190
cevap kabul oranı: 36%

1

Cevabınız için teşekkürler hocam...

(05 Ağu '15, 10:17) OPTIMUS OPTIMUS's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×86
×27
×4
×1
×1

Soruldu: 03 Tem '15, 09:07

Görüntüleme: 439 kez

Son güncelleme: 05 Ağu '15, 10:40

powered by BitNami OSQA