Herkese merhabalar,

Kısaca özet geçmek gerekirse Micro-ORM geliştirmeye çalışıyorum. CRUD işlemlerini temelde tamamladım fakat lazy loading kısmında takıldım. Amacım JPA deki @OneToMany Annotation'u benzer bir mantık geliştirmek.

Aşağıdaki gördüğünüz gibi TblUser ve TblTitle olmak üzeri 2 adet entity ' im var.
@FK(primaryFieldName = "tId", foreignClassName = "com.muslumozturk.tests.TblTitle", foreignPrimaryFieldName = "titleId") alanında belirttiğim bilgiler ile SELECT sorgusu oluşturup sonucu List<tbltitle> olarak döndürmeye planlıyorum. JPA nın @OneToMany Annotation'u ile lazy load 'ı nasıl yapıyor. FK annotation'undaki değerleri okuyarak lazy ile SQL sorgusunu nasıl oluşturabilirim.

import java.util.Date;
import java.util.List;
import com.muslumozturk.annotations.Column;
import com.muslumozturk.annotations.FK;
import com.muslumozturk.annotations.IgnoreMapping;
import com.muslumozturk.annotations.PrimaryKey;
import com.muslumozturk.annotations.TableName;

@TableName(name = "tbl_user")
public class TblUser {

    @PrimaryKey
    @Column(name = "ID")
    public Long id;

    @Column(name = "AD")
    public String ad;

    public String SOYAD;

    @Column(name = "YAS")
    public Date yas;

    @IgnoreMapping
    public Double number;

    @Column(name = "TITLEID")
    public int tId;

    @FK(primaryFieldName = "tId", 
        foreignClass = TblTitle.class,
        foreignPrimaryFieldName = "titleId")
    public List<TblTitle> Titles;
}

import com.muslumozturk.annotations.Column;
import com.muslumozturk.annotations.TableName;

@TableName(name = "tbl_title")
public class TblTitle {

    @Column(name="title_id")
    public int titleId;

    @Column(name="title_name")
    public String titleName;  
}

Teşekkürler

soruldu: 24 Kas '14, 17:08

M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image

Müslüm ÖZTÜRK
10.7k103691
cevap kabul oranı: 28%

değiştirildi: 29 Kas '14, 05:37

JPA implemantasyonunu taklit için JPA spesifikasyonuna başvurabilirsiniz https://java.net/downloads/jpa-spec/JavaPersistenceFR3.pdf

(25 Kas '14, 11:12) Dkyc Dkyc's gravatar image
3

@muslum-ozturk Neden bir orm yazma ihtiyaci duyuyorsunuz? Varolan implementasyonlar yapmak istediginiz seyleri yapmiyor mu? Ya da farkli bir soruna cozum bulmak icin yazmiyorsaniz tekerlegi yeniden bulmanin anlami yok bence.

(25 Kas '14, 19:11) CemIkta ♦ CemIkta's gravatar image

@CemIkta bey, bir framework geliştiriyoruz ve DB işlemleri için JPA kullanıyoruz. JPA in yönetilmesi zor oluyor. persist.xml gibi bir yapının olmasıda hoşuma gitmiyor çünkü db ayarları config dosyamda şifreli halde saklıyorum zaten birde persist.xml ile uğraşıyorum.Ayrıca Db'ye bağlanmak için ta en dibe framework katmanına Persistance nesnesini UI katmanından yollamam gerekiyor. Burdaki hazır yazılmış olması yada olmamasından ziyade benim onu daha iyi yönetmem önemli.

(26 Kas '14, 06:05) Müslüm ÖZTÜRK M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image
1

@muslum-ozturk JPA implementasyonlarinin hepsinde bazi handikaplar var ama yeniden bir JPA implementasyonu yazmak cok zaman alir, sonra eklemeler, bakimi ve performans sorunlarini cozme, caching, farkli veritabani destegi gibi bircok isi beraberinde getiriyor. Genelde boyle durumlarla karsilasinca ben sunu soruyorum kendime: "Projeyi mi bitirmeliyim framework mu yazmaliyim? Hangisi oncelikli!" JPA özellestirmeleri zor evet. Belki de aradigin ozellikleri ebans, openjpa, jdo, ibatis gibi implementasyonlarda/libs'de aramalisin. Basarilar.

(27 Kas '14, 16:48) CemIkta ♦ CemIkta's gravatar image

@CemIkta size katılıyorum. Emeğe değip değmeyeceği çok iyi hesaplanmalı. Önerdiğiniz kütüphaneleri inceleyeceğim. Bunların yanında sorumda yapmak istediğim şeyi nasıl başarabilirim. Aklıma en başından beri gelen AOP fikri vardı ama onunla annotationu yakalayıp lazy loading yaptırmak ne kadar mümkün onuda tam bilmiyorum açıkcası. Sizin önerebileceğiniz bir başka yöntem varmıdır acaba. Teşekkürler

(28 Kas '14, 18:40) Müslüm ÖZTÜRK M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image

Proxy tasarım şablonunu kullanarak yapmak istediğimi başardım.AOP yer girmeden çözüm üretebilmek daha çok hoşuma gitti. Benze soruna çözüm arayan birisi olabilir düşüncesiyle yaptıklarımı izah etmeye çalışacağım.

Öncelikle Aşağıdaki FrList class'ı oluşturdum. Sonrasında tbl_user tablosunda çektiğim sonuçları TblUser objesini doldururken eğer field @FK notasyonuna sahip ise aşağıdaki kodu yazdım

List<?> list = new FrList<>(fk.primaryFieldName(), 
                            fk.foreignClassType(), 
                            fk.foreignPrimaryFieldName(), conn, obj);
field.set(obj, list);

Böylelikle FrList sınıfındaki alanlara bana gerekli değerleri setlemiş oldum. Proxy tasarım şablonu ile de her metodun öncesinden eğer veri daha önce çekilmemiş ise dbden çekilmesini GetListLazy metodu ekledim.

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/**
 *
 * @author mozturk
 * @param <T>
 */
public class FrList<T> implements List<T> {

    private List<T> list;

    String primaryFieldName;
    Class foreignClassType;
    String foreignPrimaryFieldName;
    DbConnection conn;
    Object object;

    private Boolean _isDataLoaded = false;

    public FrList( String primaryFieldName, 
                    Class foreignClassType, 
                    String foreignPrimaryFieldName, 
                    DbConnection conn, 
                    Object object) {
        this.primaryFieldName = primaryFieldName;
        this.foreignClassType = foreignClassType;
        this.foreignPrimaryFieldName = foreignPrimaryFieldName;
        this.conn = conn;
        this.object = object;

        this.list = new ArrayList<T>();
    }

    private void GetListLazy() {
        try {

            if (!_isDataLoaded) {

                //primaryFieldName,foreignClassType,foreignPrimaryFieldName
            //Bilgilerini kullanarak db den verileri getir
                //gelen sonucu list objesine setle.
            }
        } catch (Exception ex) {
            System.out.println("GetListLazy metodunda Hata oluştu. Mesaj: " + ex);
        }

    }

    @Override
    public int size() {
        GetListLazy();
        return list.size();
    }

    @Override
    public boolean isEmpty() {
        GetListLazy();
        return list.isEmpty();
    }

    @Override
    public boolean contains(Object o) {
        GetListLazy();
        return list.contains(o);
    }

    @Override
    public Iterator<T> iterator() {
        GetListLazy();
        return list.iterator();
    }

    @Override
    public Object[] toArray() {
        GetListLazy();
        return list.toArray();
    }

    @Override
    public <T> T[] toArray(T[] a) {
        GetListLazy();
        return list.toArray(a);
    }

    @Override
    public boolean add(T e) {
        GetListLazy();
        return list.add(e);
    }

    @Override
    public boolean remove(Object o) {
        GetListLazy();
        return list.remove(o);
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        GetListLazy();
        return containsAll(c);
    }

    @Override
    public boolean addAll(Collection<? extends T> c) {
        GetListLazy();
        return list.addAll(c);
    }

    @Override
    public boolean addAll(int index, Collection<? extends T> c) {
        GetListLazy();
        return addAll(index, c);
    }

    @Override
    public boolean removeAll(Collection<?> c) {
        GetListLazy();
        return removeAll(c);
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        GetListLazy();
        return retainAll(c);
    }

    @Override
    public void clear() {
        GetListLazy();
        list.clear();
    }

    @Override
    public T get(int index) {
        GetListLazy();
        return list.get(index);
    }

    @Override
    public T set(int index, T element) {
        GetListLazy();
        return list.set(index, element);
    }

    @Override
    public void add(int index, T element) {
        GetListLazy();
        list.add(index, element);
    }

    @Override
    public T remove(int index) {
        GetListLazy();
        return remove(index);
    }

    @Override
    public int indexOf(Object o) {
        GetListLazy();
        return list.indexOf(o);
    }

    @Override
    public int lastIndexOf(Object o) {
        GetListLazy();
        return list.lastIndexOf(o);
    }

    @Override
    public ListIterator<T> listIterator() {
        GetListLazy();
        return list.listIterator();
    }

    @Override
    public ListIterator<T> listIterator(int index) {
        GetListLazy();
        return list.listIterator(index);
    }

    @Override
    public List<T> subList(int fromIndex, int toIndex) {
        GetListLazy();
        return list.subList(fromIndex, toIndex);
    }

}

İyi çalışmalar.

permanent link

cevaplandı: 05 Ara '14, 11:54

M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image

Müslüm ÖZTÜRK
10.7k103691
cevap kabul oranı: 28%

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:

×1,079
×14
×9
×3

Soruldu: 24 Kas '14, 17:08

Görüntüleme: 690 kez

Son güncelleme: 05 Ara '14, 11:54

powered by BitNami OSQA