You are on page 1of 32

HACETTEPE ÜNİVERSİTESİ

BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

m
BİL447 - YAZILIM MÜHENDİSLİĞİ LABORATUVARI

ARAŞTIRMA ÖDEVİ

o
(Cayenne)

i.c
Ali Seydi Keçeli
20221738

aliseydikeceli@gmail.com

dil
java
w.
ww
m
1.Giriş.......................................................................................................................3
2.Yükleme................................................................................................................3
2.1 Sistem Gereksinimleri..........................................................................4

o
2.2 Yükleme...............................................................................................4
2.3 Jar Dosyalarõ ve Gereksinimler............................................................4
2.4 Kaynak Dosyalardan Derleme.............................................................5
3 Tasarõm................................................................................................................. 5

i.c
3.1 Nesne İlişkisel Eşeleme........................................................................5
3.2 Object Graph........................................................................................5
3.3 Veri Nesneleri......................................................................................6
3.4 Erişim Sõnõflarõ.....................................................................................6
3.5 Birincil Anahtar Yaratma.....................................................................7
3.6 Verinin Cayenne’de Saklanmasõ..........................................................7
4 Ant ile Sõnõf Tanõmlama........................................................................................8
5 Data Context’i Kullanmak....................................................................................9

dil
5.1 Data Context’i elde etmek...................................................................9
5.2 Sorgularõ Çalõştõrmak..........................................................................10
5.3 Veri Nesneleri Durum Yönetimi.........................................................11
5.4 Nesneleri Bağlamlar Arasõnda Kaydõrmak..........................................12
6 Sorgularõ Kullanmak............................................................................................13
6.1 Select Sorgusu.....................................................................................13
6.2 Niteleyici İfadeler................................................................................14
va
6.3 Sõralamalarõ Kullanmak.......................................................................15
6.4 Parametreli Sorgular............................................................................16
6.5 SQL Şablon Sorgusu............................................................................17
6.6 DataMap’te Saklanan Sorgular............................................................19
7 Veri Nesneleriyle Çalõşmak..................................................................................20
7.1 İlişkiler.................................................................................................20
7.2 Veri Nesne Örneği...............................................................................21
7.3 PK/FK Değerlerine Erişmek................................................................22
ja

7.4 DataObjectUtils....................................................................................23
7.5 Kalõtõmõn Ele Alõnmasõ........................................................................24
7.6 Veri Nesnlerinin Geçerliliğini Denetlemek.........................................25
8 Stored Procedure ler iler çalõşmak........................................................................26
8.1 Nesneleri Seçmek..............................................................................26
8.2 Bir Stored Procedure ile Çalõşmak....................................................27
w.

8.3 Strored Procedure ve Transactionlar.................................................28


9 İfadeleri Kullanmak.........................................................................................28
9.1 Yol İfadeleri.......................................................................................28
9.2 İfade Oluşturma.................................................................................28
9.3 NULL Değerler.................................................................................29
9.4 Bellekte Hesaplama..........................................................................29
10 Performans İyileştirme.......................................................................................30
ww
Giriş:

m
Cayenne güçlü bir açõk kaynak kodlu object/relational framework’tür.Cayenne javada yazõlmõş olup , ilişkisel
veritabanlarõ kullanan java uygulama geliştiricileri içindir.

Cayenne proje geliştirim zamanõnõ , veritabanõ projelerinde nesne tabanlõ bir soyutlama yaparak kõsaltmaktadõr.Bu
sayede yazõlõm ekbinin SQL ve veritabanõ detaylarõna daha az odaklanarak , sitemin işlevselliği yüksek olan

o
kesimleri üzerinde yogulaşõrlar.

1.1 Özellikler Rehberi:

i.c
Cayenne içerisinde pekçok özellik barõndõrmaktadõr.Bunlar aşağõda belirtilmiştir.Bunlar

1.1.1 DTD eklentileri

"cayenne.xml" and "*.map.xml" dosya formatlarõ yeni sürümlerde güncellenmiştir.

1.1.2 İleri yerel ve Dağõtõk önbellekleme


Cayenne kendi nesne cache’ini dataconext ile paylaşabilmektedir.

1.1.3 Optimistic Locking

1.1.5 Entity Inheritance


dil
va
2 Yükleme:

2.1 Sistem gereksinimleri

JDK. Cayenne JDK 1.3 veya daha üst bir versiyonuna gerek duymaktadõr.
JDBC. Cayenne ulaşõcağõ veri tabanlarõnõn JDBC sürücülerine gereksinim duyar.
İlgili sürücüleri aşağõdaki adresten indirebilirsiniz.
http://industry.java.sun.com/products/jdbc/drivers.
ja

XML SAX Parser (JDK1.3 için).Eğer JDK1.3 kullanõyorsanõz 3. parti bir pakete ihtiyacõnõz olacak.Java
SAX parser’õ aşagõdaki adresten indirebilirisiniz.
http://xml.apache.org/
JDBC2.0 Opsiyonel Paket (JDK1.3 için) Eğer JDK1.3 kullanõyorsanõz.JDBC2.0 paketini indirmeniz
gerekmektedir.
w.

2.2 Yükleme

Cayenne sõkõştõrõlmõş dosyalar halinde dağõtõlmaktadõr.Yüklemeden önce gelen dosyalarõ açõp Jar dosyalarõnõ
projeniz için hazõr hale getirmelisiniz.Cayenne aşagõdaki formattaki bir dosya olarak indirebilrisiniz.
ww

cayenne-src-[release-suffix].tar.gz.
Sõkõştõrõlmõş bu dosyayõ açmak için windows sistemlerde winzip programõnõ kullanabilirsiniz. Unix sistemlerde
ise aşağõdaki komutlarõ yazmanõz gerekecek.

# gz -dc [filename].tar.gz | tar xf –


veya
# tar xzf [filename].tar.gz
Jsdk 1.4 ‘ün path’i çevre değişkenlerinde kayõtlõ olamalõ.

m
2.3 Jar dosyalarõ ve gereksinimler

Yandaki dizinde iki tane jar dosyasõ vardõr [cayenne_yükleme_dizini]/lib/ :

o
1- cayenne.jar

2- cayenne-nodeps.jar

i.c
Bu dosyalar cayenne’i kullanan uygulamalar için erişlebilir olmalõdõr.(CLASSPATH ‘e eklenelidir.)Web
uygulamalarõnda bu dosyalar /WEB-INF/lib/ dizinini altõnda bulunmalõdõr.

Çalõşma zamanõnda gerekmeyen ama birlikte gelen modelle araçlarõnõ kullanmak için aşagõdaki dosyalarda ihtiyaç
vardõr.

dil
! cayenne-modeler.jar
! scope-bin-1.0.1.jar
! forms-1.0.3.jar
! plastic-1.1.2.jar
! hsqldb-1.7.2.jar
! ognl-2.6.5.jar
va
2.4 Kaynak dosyalardan derleme

Cayenne de kaynak dosyalarõ derlemeye gerek yoktur ama derlemek için önce aşagõdaki komutla ilgili dizine
gelin.Daha sonra ant’õ çalõştõrarak derleyebilrisiniz.

cd $CAYENNE_HOME/src
ja

ant

cayenne.xml örneği

<domains project-version="1.1">
w.

<domain name="DefaultDomain">
<map name="datamap" location="datamap.map.xml"/>

<node name="datanode" datasource="datanode.driver.xml"


adapter="org.objectstyle.cayenne.dba.mysql.MySQLAdapter"
factory="org.objectstyle.cayenne.conf.DriverDataSourceFactory">
ww

<map-ref name="datamap"/>
</node>
</domain>
</domains>
3.Tasarõm

m
3.1 Nesne İlişkisel Eşleme

Mapping bir objenin veri datanõndaki bir tablo veya görüntü(view) ile eşleştirilmesidir. Javada bu bir sõnõf ile
tablo veya görüntünün eşleştirilmesi ile yapõlõr.Bir sõnõfõn özellikleri veritabõnda bir sütuna denk gelmektedir veya
bir satõrõn sütununa eşlenmiş olabilir.Olasõ durumlar aşağõda gösterilmiştir.

o
• Java sõnõfõ -> veritabanõ tablosu veya görüntüsü
• Basit sõnõf niteliği -> tablo sütunu

i.c
• "karmaşõk" sõnõf niteliği -> ilişkisel veritabanõnda ilişkili bir tablo

• Java nesnesi -> tabloda bir satõr


• "basit" niteliginin içeriği -> bir satõrõn herhangi bir sütunun değeri
• "compex" niteliginin içeriği -> başka bir nesne veya nesne litsesi

Aşagõdaki şekilde haritalama işleniminin cayenne nasõl yapõldõğõ anlatõmaktadõr.

dil
ja va
w.

Cayenne haritalama işlemi için 2 katman kullanõr.Bunlar veritabanõ ve java katmanlarõdõr. Java katmanõ
veritabanõ katmanõnõ veritabanõnõ sõnõflara bağlamak için kullanõr.Mapping işlemine ait bilgiler
datamap’lerde saklanõr.Bunlar XML formatõnda dosyalardõr.
ww

3.2 Object graph

Mapping işlemi veritabanõndan gelen verinin dataobject’lere dönüştürülmesi işlemidir.


Dataobjectler birbirlerine object graph lar aracõlõğõ ile bağlanõrlar.Bunu object graph daki
ilişkiler formunu kullanarak yaparlar.

Object graph aşağõdaki temel özellikere sahiptir:

-Object graph üstünde yapõlan tüm işlemler uygulama tarafõndan kontrol edilebilir.
-Nesnelere ilk değer atama ya bir select sorgusu işletilerek veya yeni dataobject’ler
yaratõlarak sağlanõr.

m
-Veritabanõ ile senkronizedir.Değişiklik yapõldõğõnda bir method çağrõsõ ile
veritabanõ senkronize hale getirilir.
-Nesne biricikliği: cayenne veritabanõnda bir satõr ile ilişkili nesnelerden sadece bir
tane olmasõnõ sağlar.(bir datacontext içerisinde)
-Değişikler iptal edilebilir.

o
i.c
3.3 Data objeleri

Cayenne’in asõl görevi veri kaynaklarõna nesne tabanõnda erişim sağlamaktõr. Cayenne’de bulunan dataobject ler
taşõnabilirler ve sadece veri ve iş mantõğõnõ içerirler.Cayenne’de veri temsil eden her nesne dataobject
arayüzünden implement edilmelidir.

dil
ja va

Cayenne’de her nesne bir tane biricik nesne anahtarõ içerir.(object id)
w.

3.4 Erişim sõnõflarõ

Cayenne veritabanõ erişim modülü bir nesneler yõğõtõ içerir.


Bu nesneler Query engine arayüzünden implemente edilmiştir.
ww
o m
i.c
dil
Her sõnõfõn görevi aşagõda belirtilmiştir:
1-Veri Düğümleri(DataNodes) :En alt düzey controller sõnõflarõdõr.Veri tabanõna en yakõn
sõnõflardõr.Görevleri:
-Veri tabanõna JDBC sürcüsünü kullanarak bağlanmak.
va
-Sorgu nesnelerini (Query objects) sql sorgularõna çevirip işletmek.
-JDBC resultset’lerini nesnelere çevirmek.
-Yeni eklenen nesneler için anahtar türetmek.

2-Veri Alanõ(DataDomain):İkinci katman controller sõnõfõdõr.Görevleri:


-Fiziksel verikaynaklarõnõ (Datasources) mantõksal veri kaynaklarõna çevirir.Örneğin birden
fazla veri tabanõ ile çalõşõyorsanõz bağlantõ detaylarõndan kurtulmanõzõ sağlar.Her sorgu ilgili
olduğu veri tabanõ üzerinde işletilir.
ja

-Veri kaynağõ gruplarõnõn yaratõlmasõna izin verir.


-Üst ve alt katmanlara hizmet üretir.Alt veri düğümlerine(Datanodes) ve üst veri
bağlamlarõna(Data context)hizmet üretir.

3-Veri bağlamõ(Datacontext):Enüst seviye controller sõnõfõdõr.Kullanõcõlar tarafõndan doğrudan erişilen


w.

sõnõftõr.Görevleri:
-Bellekteki nesnelerdeki değişimleri saklar.Veri nesnelerindeki değişiklikler dõşarõya kapalõdõr.
-Tek satõrda işletilir.Eğer bir grup günlenmiş veri nesneniz varsa bunlarõ sql yazmadan
işlemeniz(commit) mümkün.commitChanges metodunu çağõrmanõz yeterli olacaktõr.
-Veri nesnelerini (cache) saklar.
ww

3.5 Birincil anahtar yaratma

Üzerinde işlem yapõlan nesneye ve veri tabanõ tasarõmõna bağlõ olarak birkaç farklõ yoldan anahtar yaratõlmaktadõr.
3.5.1 Anlamlõ Birincil Anahtar

m
Bazõ durumlarda veri nesneleri(dataobjects) kendi anahtarlaõnõ sağlarlar.Örneği kimlik numarasõ gibi.Bu gibi
durumlarda anahtar diğer nitelikler(attribute) gib ele alõnõr.Her anahtar sütunun ilişkilendirildiği bir nitelik
nesnesi(Objattribute) vardõr.

3.5.2 İlişkilerden Türetilmiş Birincil Anahtar

o
Bazen bir tablonun birincil anahtarõ diğer bir tablonunkine bağlõ olabilir.Bu gibi durumlarda veri nesnesi birncil
anahtarla ilişkili bir nitelik içermeyebilir.Yerine cayenne tarafõndan ilişkili bir nesnenin anahtarõ kullanõlõr.

3.5.3 Türetilmiş Birincil Anahtar

i.c
Yukarõdaki durumlarõn hiçbiri olmadõğõnda cayenne tablonun her satõrõ için biricik olan bir nesne kimliği
yaratõr.Bu nesne kimliği birincil anahtar olarak kullanõlabilir.

3.6Verinin cayennede saklanmasõ

Cayenne de iki tür veri parçasõ saklanõr.Bunlar veri nesneleri (Dataobjects ) ve veri satõrlarõdõr (Datarows) .
Veri nesneleri veri deposunun (Objectstore) bir parçasõ olarak saklanõr.Veri satõrlarõ ise veri tabanõ tablolarõnõn

dil
görüntüleri olarak düşünülebilir.Veri satõrlarõ veri satõrõ deposunda
(DataRowStore) saklanõr.Cayenne veri nesneleriyle ilgili işlemlerde veri satõrlarõnõn kullanõr.(Yaratama , günleme
vb)
va
4. Ant ile Sõnõf Tanõmlama

Cgen(cayenne class generator)

Cgen cayenne veri haritasõnõ (Datamap) kullanarak veri sõnõflarõnõn kaynak dosyalarõnõ türetip yöneten bir ant
görevidir.Eğer Cgen kullanõlõrken makepairs parametersi true olarak geçilirse her nesne entitysi için bir çift sõnõf
türetilir.False olarak geçilirse de tek sõnõf yaratõlõr.
ja

Parametreler

nitelik tanõm gereksinim


Map DataMap xml dosyasõ sõnõf yaratmada kullanõlõr evet
w.

destDir Java sõnõflarõnõn hedef dizini evet


overWrite Eğer true olarak kurulursa yeni yaratõlan sõnõflar eski hayõr
veriyonlarõnõn üzerine yazõlõr
makePairs Eğer true kurulursa alt ve süper sõnõflardan bir çift hayõr
yaratõlõr
template Velocity template dosyasõnõn konumu hayõr
superPkg Yaratõlan java super sõnõflarõnõn paket adõ hayõr
ww

usepkgPath Eğer true olarak kurulursa bir dizin ağacõ yaratõlõr hayõr
detsDir dizininde

Aşağõda cgen kullanrak “src/datamap.xml” konumundaki veri haritasõndan (Datamap) veri nesnelerinin
sõnõf/süper sõnõf çiftlerinin yaratõlmasõ örneklenmiştir.
m
<taskdef name="cgen"
classname="org.objectstyle.cayenne.tools.CayenneGenerator">
<classpath refid="classpath"/>
</taskdef>
<cgen map="src/datamap.xml" destDir="src/java/dobj"
usepkgpath="false"/>

o
i.c
5.Data Contexti kulllanmak

5.1 DataContext’i elde etmek

Kurulumun ortamõnõn özelliklerine göre dataContext birden fazla yol kullanõlarak elde edilebilir.Aşagõda
kurulmuş bir uygulama olduğu varsayõmõ ile datacontext’in elde edilişi açõklanmõştõr.

5.1.1 DataContext’i Yerinde(Spot) Yaratma

dil
Yeni bir datacontext aşagõda kod ile kolayca yaratõlõr.

import org.objectstyle.cayenne.access.DataContext;
...
DataContext context = DataContext.createDataContext();
va
5.1.2 DataContext’i İnternet Uygulamalarõnda Oturum Tabanlõ Yaratma

İnternet uygulamalarõnda aşagõdaki kod kesimi ile yaratõlõr.

import org.objectstyle.cayenne.conf.BasicServletConfiguration;
ja

import org.objectstyle.cayenne.access.DataContext;
...

HttpSession session;
DataContext context =
BasicServletConfiguration.getDefaultContext(session);
w.

5.1.3 DataContext’in Görev Bağlamõnda Yaratõlmasõ

Bir uygulama tanõmladõğõ bir görev kapsamõnda bir veya daha fazla datacontext yaratõp kullanabilir.Bunun için
DataContext.getThreadDataContext() methodunun kullancağõz.
Eğer görev hiçbir datacontext’le yükümlü değilse bu method IllegalStateException: fõrlatõr.
ww

import org.objectstyle.cayenne.access.DataContext;

DataContext context = DataContext.getThreadDataContext();


m
import org.objectstyle.cayenne.access.DataContext;
...
// Hiçbir görevle ilişkilendirilmediği durum
try {
DataContext context = DataContext.getThreadDataContext();

o
}
catch(IllegalStateException ex) {
// Hatayı yakala
....

i.c
}

5.2 Sorgularõ Çalõştõrmak

dil
Cayenne iki tip sorgu vardõr bunlar seçimli(selecting) ve seçimsiz (nonselecting) ,seçimli sorgular kendisini
çağõrana bir sonuç kümesi dönderen sorgulardõr.Seçimsiz sorgular ise bir şey döndermeyen veri tabanõ üzerinde
işlem yapa sorgulardõr(delete,insert,update).

5.2.1 Sorgu Örneklerini İşletmek


va
Seçimli ve seçimsiz sorgularõ çalõştõrmak için aşağõdaki methodlar çağrõlõr.

-public java.util.List performQuery(GenericSelectQuery query)

Bu method genelde seçimli sorgular için kullanõlõr.


ja

-public ResultIterator performIteratedQuery(GenericSelectQuery query)


throws CayenneException

Seçimli bir sorgu işletip geriye bir açõlmõş bir JDBC sonuç kümesi(resultset) üzerinde
gezen bir iterator döndürür.
w.

-public int[] performNonSelectingQuery(Query query)

Seçimsiz bir sorgu işletir.


ww

- public void performQueries(java.util.List queries, OperationObserver


resultConsumer)

Kompleks sorgular için kullanõlõr.Örneğin stored procedure bağlamonda kullanõlan kullanõlan birden fazla
sonuç kümesi içeren sorgular.
5.2.2 Haritalanmõş (Mapped) Sorgularõ Çalõştõrmak

m
• public java.util.List performQuery(String name, boolean refresh)

Veri haritasõnda(DataMap) saklanan isimlendirilmiş seçimli bir sorguyu işletir.

• public java.util.List performQuery(String name, Map parameters,

o
boolean refresh)

Veri haritasõnda(DataMap) saklanan isimlendirilmiş seçimli bir sorguyu parametrelerleri kullanarak


işletir.

i.c
• public int[] performNonSelectingQuery(String name)

Veri haritasõnda(DataMap) saklanan seçimsiz bir sorguyu işletir.

• public int[] performNonSelectingQuery(String name, Map parameters)

Veri haritasõnda(DataMap) saklanan seçimsiz bir sorguyu parametreleriyle işletir.

5.3 Veri Nesnelerinin (DataObjects) Durum Yönetimi

5.3.1 Veri Nesnelerini Kaydetmek


dil
va
Veri nesnelerini kaydetmenin iki yolu vardõr.
Birinci yolda belirgin bir yolla kaydederiz.

import org.objectstyle.cayenne.access.DataContext;
...
DataContext ctxt; //
ja

// artist CayenneDataObject den kalıtılmıştır


Artist artist = new Artist();

ctxt.registerNewObject(artist);
w.

// yukarıdaki satır işletildikten sonra


// artist object aquired "persistent" behavior
// ve datacontext tarafından yönetilir.

İkinci yolda ise yazõlan kod miktarõnõ kõsaltma açõsõndan daha iyidir.
import org.objectstyle.cayenne.access.DataContext;
ww

...
DataContext ctxt; //önceden tanımlı olduğunu farz edin

Artist artist = (Artist)ctxt.createAndRegisterNewObject(Artist.class);


m
5.3.2 Kaydedilen Nesnenin Durumunu Kontrol Etmek

Her nesnenin durumu bir tam sayõ ile belirtilir.

Yeni bir nesne eklendiğinde bu sayõ ‘NEW’ değerini alõr.

o
import org.objectstyle.cayenne.access.DataContext;
...

i.c
DataContext ctxt;

// artist PersistenceState.NEW değerini alır


Artist artist = (Artist)ctxt.createAndRegisterNewObject(Artist.class);

Bir niteliği değiştirildiğinde ise MODIFIED değerini alõr.

// daha önceden veri tabanından okunduğunu varsayın


Artist artist;

dil
// nesne durumu PersistenceState.MODIFIED olarak değişir.
artist.setName("NewName");
va
Silindiği zaman ise ‘DELETE’olarak değişir.

import org.objectstyle.cayenne.access.DataContext;
...
DataContext ctxt; //
ja

Artist artist;

// nesne durumu PersistenceState.DELETED oalrak değişir


ctxt.deleteObject(artist);
w.
ww
5.4 Nesneleri Kaydõrmak

m
Veri nesnelerinin her olgusu sadece bir veri bağlamõna (Data Context) aittir.Nesne ilgili olduğu bağlamõn yaşam
döngüsü boyunca varolabilir.Bazen veri nesnelerini iki farklõ bağlam arasõnda kaydõrmak gerekebilir.Bu işlemin
yapõlma amacõ birbiriyle ilişki içinde olan nesnelerin kullanõlmasõdõr.Örneğin bir uygulama pek çok oturum
tarafõndan paylaşõlabilecek salt okunur verilerden oluşan bir veri bağlamõ içerebilir.Bu durumda verilerin oturum
veri bağlamõna taşõnmasõ uygun olacaktõr(Tekrar tekrar okuma yapmaktansa).Bu işlemi yerine getirmek için
DataContext.localObject(): çağrõlmalõdõr.Aşağõda kullanõmõ örneklenmiştir.

o
...

i.c
HttpSession session; //

// ServletContext’in kullanıcı tanımlı veri nesneleri içerdiğini varsayın


// global DataContext alınıp getirildi
List sharedUserTypes = (List)
session.getServletContext().getAttribute("userTypes);

// transfer paylaşıldı

dil
DataContext sessionContext =
BasicServletConfiguration.getDefaultContext(session);
List localUserTypes = sessionContext.localObjects(sharedUserTypes);

UserType type = (UserType) localUserTypes.get(0);


User user; //

// oturum nesneleri
va
user.setUserType(type);
...
ja

6 Sorgularõ Kullanmak

Sorgular Cayenne veri kaynaklarõyla (RDBMS )haberleşmesinde birer soyutlamadõr.Sorgular hedef veri tabanõ
tarafõndan kullanõlan SQL sözdiziminden bağõmsõz java nesneleridir.Cayenne kullanõcõlarõ için sadece üç tip sorgu
önem taşõr.
w.

• SelectQuery:
• SQLTemplate
• ProcedureQuery

6.1 SelectQuery
ww

Sorgular arasõnda en çok kullanõlanõdõr.Data Context in uygun veri nesnelerini alõp getirmesini öngören bir
tanõmlayõcõdõr.Kriterlere uygun nesne listelerinin oluşturulmasõnõ sağlayan sorgulardõr.
6.1.1 SelectQuery Kesimleri

m
Üç kesimden oluşur bunlar kök nesne , yeterlilik ifadesi(Qualifier expression) ve sõralama listesi ( ordering list).

Cayenne SelectQuery SQL SELECT ifadesi Gereklilik


Kök From tümcesi Evet
Yeterlilik ifadesi Where tümcesi Hayõr

o
Sõralama listesi Order By tümcesi Hayõr

i.c
Aşağõdaki biçimde yenibir tane tanõmlanõr.

import org.objectstyle.cayenne.query.SelectQuery;
...
// Geçerli bir cayenne sorgusu
// artist tablosundaki her satır için bir artist nesne olacak
SelectQuery query = new SelectQuery(Artist.class);

6.1.2 SelectQuery’lerin çalõştõrõlmasõ dil


DataContext.performQuery()metodu kullanõlarak işletilir.Kullanõmõ aşağõda örneklenmiştir.
va
import org.objectstyle.cayenne.query.SelectQuery;
import org.objectstyle.cayenne.access.DataContext;
import java.util.List;
...
DataContext ctxt;
SelectQuery query = new SelectQuery(Artist.class);
ja

// Bu sorgu artist listesinde tüm satırları alır


// liste geriye her satır için bir artist nesnesi döndürür
List artists = ctxt.performQuery(query);
w.

6.2 Niteleyici İfadeler


ww

Cayenne sorgularõ kontrol edebilmek amacõyla ifade paketlerini bünyesinde barõndõrõr.Sorgularõ uygulamak için
kullanõlan ifadelere qualifier denir.

SelectQuery qualifier’a ilk değer atama ve modifiye işlemleri için bir kaç değişik yol öngörür.

public SelectQuery(Class objectClass, Expression e)


İfadeyi yapõcõ fonksiyona bir parametre olarak geçeriz.
public void setQualifier(Expression qualifier)
Harici olarak atama yaparõz.

m
public void andQualifier(Expression e)
Varolan bir qualifier’a bir ifadeyi ekleriz (mantõksal ve ile)

public void orQualifier(Expression e)


Varolan bir qualifier’a bir ifadeyi ekleriz(mantõksal yada ile)

o
6.3 Sõralamalarõ Kullanmak

Sonuçlarõ sõralõ istediğimiz zaman kullanmamõz gerekir.Örneğin:

i.c
import org.objectstyle.cayenne.query.SelectQuery;
...
SelectQuery query = new SelectQuery("Artist");

// isme göre sıralama istemi ekle


query.addOrdering("artistName", true);

import org.objectstyle.cayenne.query.Ordering;
...
dil
Bu kod ile isime göre sõralõ bir liste elde ederiz.
Ayrõca java bean’lerin bellekte sõralanmasõ içinde kullanõlabilir.

// Önceden belirlenip değer ataması yapılmış bir liste


List list = ...;
va
Ordering ordering = new Ordering("artistName", true);

// listeyi sırala
ordering.orderList(list);
ja

Birden fazla özellik içinde sõralama yaptõrmak isteyebiliriz.Bunun için orderlist() metoduna birden fazla orderings
türünde parametre geçmek gerekir.Sõralam işlemi önce ilk niteliğe göre eğer eşitlik varsa ikinci niteliğe göre
yapõlõr.
w.

import org.objectstyle.cayenne.query.Ordering;
...
// önceden tanımlı bir liste
List list = ...;
ww

List orderings = new ArrayList();


orderings.add(new Ordering("paintingTitle", true));
orderings.add(new Ordering("estimatedPrice", false));

Ordering.orderList(list, orderings);
6.4 Parametreli Sorgular

m
Sorgular bazen aşõrõ komplex olabilirler.Bu gibi durumlarda olumsuz sonuçalrõ gidermek için tanõmlanõş olan
prototip yada şablon bir sorguyu kullanõp , ona gerekli parametreleri geçerek istediğimiz işlemi yaptõrmak daha
akõllõca olacaktõr.Cayenne de bu durumlar için parametreli sorgular kullanõlõr.

o
Expression.fromString(..): metodunu kullanarak prototip bir sorgu yaratmak

import org.objectstyle.cayenne.exp.Expression;
import org.objectstyle.cayenne.query.SelectQuery;

i.c
...
// bir qualifier yarat
Expression qual = Expression.fromString("paintingTitle = $pname or
toArtist.artistName = $aname");

SelectQuery proto = new SelectQuery(Painting.class, qual);


proto.setDistinct(true);

Örnek:

import java.util.*;
import org.objectstyle.cayenne.exp.Expression;
dil
import org.objectstyle.cayenne.exp.ExpressionFactory;
import org.objectstyle.cayenne.exp.ExpressionParameter;
va
import org.objectstyle.cayenne.query.SelectQuery;
...
// İki parametreli bir qualifier yarat
// "pname" and "aname"
List list = new ArrayList();
list.add(ExpressionFactory.matchExp("paintingTitle",
new ExpressionParameter("pname")));
ja

list.add(ExpressionFactory.matchExp("toArtist.artistName",
new ExpressionParameter("aname")));
Expression qual = ExpressionFactory.joinExp(Expression.OR, list);

// bir sorgu prototipi yarat


SelectQuery proto = new SelectQuery(Painting.class, qual);
w.

proto.setDistinct(true);

Yukarõdaki örnekte yaratõlan prototipi kullanarak yeni sorgular yaratabiliriz.

public SelectQuery SelectQuery.queryWithParameters(Map parameters, boolean pruneMissing) Prototipi


ww

kullanarak yeni bir selectQuery yaratõp geriye döndürür.

public SelectQuery SelectQuery.queryWithParameters(Map parameters)

Aşagõdaki ifadenin kõsaltõlmõş bir biçimi.

SelectQuery queryWithParameters(Map parameters, true).


queryWithParameters için bir örnek.

m
İmport java.util.Map;
import java.util.HashMap;
import org.objectstyle.cayenne.query.SelectQuery;
...
SelectQuery proto = ... // Bu önceki örnekte yaratıldı

o
// sorgu yarat
Map params1 = new HashMap();
params1.put("aname", "Dali");

i.c
SelectQuery query1 = proto.queryWithParameters(params1);

query1.setFetchLimit(100);
...
// farklı parametrelerle yeni bir sorgu yarat
Map params2 = new HashMap();

dil
params2.put("aname", "Monet");
params2.put("pname", "The Beach at Trouville");
SelectQuery query2 = proto.queryWithParameters(params2);
...
va
6.5 SQL Şablon Sorgularõ(SQLTemplate queries)

Sql’i tümüyle nesnelere eşlemek her zaman mümkün olmyabilir.Bunun için cayenne güçlü bir betiklenebilir
(Scriptable) şablon sorgu mekanizöasõ içerir.

6.5.1 Şablon Sorgularõn Yaratõlmasõ


ja

Şablon sorgular iki ana kõsõmdan oluşur bunlar kök ve dinamik katar (String) kõsõmlarõdõr. Yapõcõ fonksiyonda yer
alan boolean türü değişken ise sorgunun geriye bir sonuç dönderip döndermeyeceğini belirtmek içindir.
w.

import org.objectstyle.cayenne.query.SQLTemplate;
...
// seçimli bir SQLTemplate yarat
SQLTemplate selectQuery = new SQLTemplate(Artist.class, "select * from
ARTIST", true);
...
ww

// güncelleme yapcak bir SQLTemplate yarat


SQLTemplate updateQuery = new SQLTemplate(Artist.class, "delete from
ARTIST", false);

6.5.2 SQLTemplate ile nesnelerin seçilmesi

Seçimli (select içeren ) sorgulara benzemekle beraber DataContext.performQuery(..)


metodu ile çağrõlõr fakat parametrelerle configüre edilebilir.(satõr limiti gibi ).
m
data rows.import org.objectstyle.cayenne.query.SQLTemplate;
...
// tüm artistleri getir ama toplam sayı binden az olsun
SQLTemplate rawSelect = new SQLTemplate(Artist.class, "select * from
ARTIST", true);

o
rawSelect.setFetchLimit(1000);

List artists = dataContext.performQuery(rawSelect);

i.c
6.5.3 SQLTemplate ile verinin günlenmesi

DataContext.performNonSelectingQuery(..) metodu ile veri tabanõnda günleme yapabiliriz.Geriye


bir sonuç döndermez.

import org.objectstyle.cayenne.query.SQLTemplate;
...

dil
SQLTemplate rawDelete = new SQLTemplate(Artist.class, "delete from ARTIST",
false);
int[] deleteCounts = dataContext.performNonSelectingQuery(rawDelete);

6.6 Sonuçlarõn Önbelleklenmesi

Bu konuda cayenne 3 ayrõ politika uygular :


va
GenericSelectQuery.NO_CACHE: Ön tanõmlõ politikadõr, her sorgu sonucu için bir ön bellekte saklama işlemi
yapõlmaz.
GenericSelectQuery.LOCAL_CACHE:Her veri bağlamõ için ön bellekleme ayrõ yapõlõr.
GenericSelectQuery.Shared_CACHE:Tüm veri bağlamlarõ ortak bir cache kullanõr.
ja

6.6.1 Sorgunun Ön Bellekleme Yapacak Biçimde Kurulmasõ


Bir örnekle aşağõda belirtilmiştir.
w.

DataContext context = ... //

SelectQuery query = new SelectQuery(Artist.class);


...

// sorguyu yerel cache kullancak şekilde configüre et


query.setName("MySelect");
ww

query.setCachePolicy(GenericSelectQuery.LOCAL_CACHE);

// yinelemeyi kapat
query.setRefreshingObjects(false);

List objects = context.performQuery(query);


DataContext context = ... //

m
SQLTemplate query = new SQLTemplate(Artist.class, true);
...

// sorguyu paylaşılmış cache kullancak şekilde konfigüre et


query.setName("MyRawSelect");

o
query.setCachePolicy(GenericSelectQuery.SHARED_CACHE);

// yinelemeyi kapat (refresh)

i.c
query.setRefreshingObjects(false);

List objects = context.performQuery(query);

6.6.2 Ön Belleğin Yinelenmesi (refresh)


dil
Ön bellek yineleme işlemi için zorlanabilir.Bellekteki nesneler uğradõklarõ değiimlerden sonra son hallerinde
saklanmalarõ sağlanõr.
va
DataContext context = ... //

SelectQuery query = new SelectQuery(Artist.class);


...
query.setName("MySelect");
query.setCachePolicy(GenericSelectQuery.LOCAL_CACHE);
ja

// yinelmeye zorla
query.setRefreshingObjects(true);

List objects = context.performQuery(query);


w.

6.7 DataMap’te Saklanan Sorgular

Eğer bir sorgõ birden fazla yerde kullanõlõyorsa ,okunabilirlik için bu sorguya sembolik bir isim verilebilir. Bu
işlem aynõ zamanda sorgu yaratma işlemlerinide hõzlandõrmaktadõr.
ww

DataContext context = ... // önceden tanımlı

// datamap her türlü sorguyu saklayablir.


SelectQuery prototype = (SelectQuery)
context.getEntityResolver().lookupQuery("MySelect");

// customize query
Map params = new HashMap();

m
params.put("aname", "Monet");
SelectQuery query = prototype.queryWithParameters(params);

// sorguyu çalıştır.
List objects = context.performQuery(query);

o
Ayrõca sorgularõ parametre atayarakta çalõştõrmamõzõ sağlar

DataContext context = ... //

i.c
// "false" eğer uygunsa önceden cache edilmiş bir sonuç kümesinin
// kullanılmasını belirtir.
List objects = context.performQuery("MySelect", false);

7.Veri Nesneleriyle Çalõşmak

dil
Veri nesneleri nitelik ve ilişkilerin birarada bulunduğu bir bütündür.Nitelikler veri tabanõ sütunlarõnda tutulan
değerleri belirten en basit nesne özellikleridir.Bunlar nümerik yada karaterlerden oluşan değerlerdir.Bunlar dõşõnda
kalan özellikler ise ilişkileri belirtir.İlişkiler bir veri nesnesinin bir yada birçok veri nesnesi ile olan ilişklilerini
belirtir.
va
7.1 İlişkiler

İlişkiler bir veri nesnesinin ilişkili olduğu diğer nesneler için referans olan nesne özellikleridir.İki tür ilişki vardõr
, bunlar bire-bir ve bire-birçok ilişkileridir.

7.1.1 Bire-Bir İlşkiler

Bire bir ilişkide bir veri nesnesi diğer bir veri nesnesi ile ilişkilidir. İlgili veri nesnesinin get methodu çağrõldõğõnda
ja

ilişkili olduğu veri nesnesi geriye döndürülür.Eğer bellekte yoksa diskten okunur.Bu nesnelerin çağrõlmasõnda
tanõmlõ methodlar sõnõf yaratõldõğõnda otomatik olarak tanõmlanmaktadõr.Aşagõdaki getToArtist methodu gibi.

Painting painting;
w.

// painting sınıfı için tanımlı


Artist originalArtist = painting.getToArtist();

// yeni bir artist ile değiştir.


Artist newArtist = (Artist)context.createAndRegisterNewObject(Artist.class);
painting.setToArtist(newArtist);
ww

// artisti sil
// painting.setToArtist(null);

7.1.2 Bire-Birçok İlşkiler

Bu tür ilişkilerde bir veri nesnesi birden çok veri nesnesi ile ilişkildir.Bu durumda get methodu geriye ilişkili
nesnelere ilişkin bir liste geriye döndürür.
Artist artist;

m
// artist birden çok paintings ile ilişkili
List paintings = artist.getPaintingArray();

// ilk painting’i sil


if(paintings.size() > 0) {

o
Painting firstPainting = (Painting)paintings.get(0);
artist.removeFromPaintingArray(firstPainting);
}

i.c
// yeni bir tane ekle
Painting newPainting =
(Painting)context.createAndRegisterNewObject(Painting.class);
artist.addToPaintingArray(newPainting);

7.2 Veri Nesnesi Örneği

import java.math.BigDecimal;
import java.util.List;
dil
Aşagõda bir Painting nesnesinin alõp getirilip değiştirildikten sonra geri kaydedilmesini gösteren bir örnek
almaktadõr.

import org.objectstyle.cayenne.access.DataContext;
import org.objectstyle.cayenne.query.SelectQuery;
va
import org.objectstyle.cayenne.exp.Expression;
import org.objectstyle.cayenne.exp.ExpressionFactory;
import org.objectstyle.art.Painting;
import org.objectstyle.art.Artist;
...
// Bunun daha önceden var olduğunu farzedin
DataContext ctxt;
ja

...
Expression e =
ExpressionFactory.greaterExp("estimatedPrice",
new BigDecimal(100000.0));
SelectQuery q = new SelectQuery(Painting.class, e);
List realExpensiveArt = ctxt.performQuery(q);
w.

if(realExpensiveArt.size() > 0) {
Painting firstPainting = (Painting)realExpensiveArt.get(0);

// değeri iki katına çıkar


double oldPrice = firstPainting.getEstimatedPrice().doubleValue();
firstPainting.setEstimatedPrice(new BigDecimal(oldPrice * 2.00));
ww

// yeni bir painting yarat ve onu veri bağlamına kaydet


// "Painting" datamap’te ObjEntity nesnesnin ismi
Painting newPainting =
(Painting)ctxt.createAndRegisterNewObject(Painting.class);
newPainting.setPaintingTitle("Sunset as it is");

newPainting.setEstimatedPrice(new BigDecimal(5000000.0));
m
// ilişkili olduğu artisiti al
Artist artist = firstPainting.getToArtist();

// painting nesneisne yeni bir artist ata


artist.addToPaintingArray(newPainting);

o
// değişiklikleri kaydet
ctxt.commitChanges();
}
...

i.c
7.3 PK/FK Değerlerine Ulaşmak

PK(primary key) ve FK (foreign key) değerlerine nesne niteliklerine erişir biçimde erişmek doğru bir yöntem
değildir.Cayenne bunun için jenerik bir çözüm sunar.Alõşõlmõş get methodlarõnõ kullanrak uygular bu çözümü.

Aşağõdaki örneği inceleyelim

package org.objectstyle.art;
dil
public class Painting extends org.objectstyle.art.auto._Painting {

}
va
package org.objectstyle.art.auto;

/** Class _Painting cayenne tarafından yaratıldı


* tekrar kod türettiğinde üzerine yazılacaktır.
* değişikliğe ihtiyaç duyarsanız bunu alt sınflarda yapın
ja

*/
public class _Painting extends org.objectstyle.art.ArtDataObject {

public static final String ESTIMATED_PRICE_PROPERTY = "estimatedPrice";


public static final String PAINTING_TITLE_PROPERTY = "paintingTitle";
public static final String TO_ARTIST_PROPERTY = "toArtist";
w.

public static final String TO_GALLERY_PROPERTY = "toGallery";


public static final String TO_PAINTING_INFO_PROPERTY = "toPaintingInfo";

public static final String PAINTING_ID_PK_COLUMN = "PAINTING_ID";

public void setEstimatedPrice(java.math.BigDecimal estimatedPrice) {


writeProperty("estimatedPrice", estimatedPrice);
ww

}
public java.math.BigDecimal getEstimatedPrice() {
return (java.math.BigDecimal)readProperty("estimatedPrice");
}

public void setPaintingTitle(String paintingTitle) {


writeProperty("paintingTitle", paintingTitle);
}
public String getPaintingTitle() {

m
return (String)readProperty("paintingTitle");
}
...
}

o
package org.objectstyle.art;

i.c
public class Painting extends org.objectstyle.art.auto._Painting {
/** salt okunur PK */
public Integer getPaintingId() {
return (getObjectId() != null && !getObjectId().isTemporary())
?
(Integer)getObjectId().getIdSnapshot().get(PAINTING_ID_PK_COLUMN)
: null;
}

/** salt okunur FK */


public Integer getArtistId() {
Artist artist = getArtist();
return (artist != null)
?
dil
(Integer)artist.getObjectId().getIdSnapshot().get(Artist.ARTIST_ID_PK_COLUMN)
: null;
va
}
}

7.4 DataObjectUtils
ja

DataObejctUtils sõnõfõ bir veri nesnesinden birincil anahtar elde etmede ve anahtarõ bilinen bir nesneye ulaşõlmada
önemli kolaylõklar sağlar.Aşağõda ilk olarak bir nesneye ilişkin bir birincil anahtarõn yaratõlmasõ örneklenmiştir.

// brirncil anahtar elde edilmesi


Artist artist = ...;
w.

int artistID = DataObjectUtils.intPKForObject(artist);


String artistURL = "http://www.example.org/catalogapp/artists?a=" +
artistID;
ww

Aşağõda ise verilen bir anahtardan nesnenin bulunmasõ örneklenmiştir.

// ilgili parametrelerden bir artist’in bulunması


HttpServletRequest request = ...;
DataContext context = ...;
String idString = request.getParameter("a");
if(idString != null) {

m
Artist artist = DataObjectUtils.objectForPK(context, Artist.class,
Integer.parseInt(idString));
}

o
7.5 Kalõtõmõn Ele Alõnmasõ

i.c
7.5.1 Kalõtõm ve Yeni Veri Nesneleri

Aşağõdaki sõnõf hiyarerşisini düşünün.

dil
va
AbstractPerson sõnõfõnõn kullanõcõ tipini belirten bir niteliği mevcuttur.Javada bu nitelik anlmasõzdõ çünkü
ja

kullanõcõ tipi sõnõf tarafõndan belirlenmektedir.Veri tabanõnda bunu yapmak için sõnõf türünü belirleyen bir kolon
kullanmalõyõz .Her sõnõf içinde bu nitelikle ilgili metodu override etmeliyiz.
w.

public class Employee extends _Employee {


public void setPersistenceState(int state) {
super.setPersistenceState(state);

if(state == PersistenceState.NEW) {
setPersonType("EMPLOYEE");
}
ww

}
...
}

public class Manager extends _Manager {


public void setPersistenceState(int state) {
super.setPersistenceState(state);
if(state == PersistenceState.NEW) {

m
setPersonType("MANAGER");
}
}
...
}

o
public class CustomerContact extends _CustomerContact {
public void setPersistenceState(int state) {
super.setPersistenceState(state);

i.c
if(state == PersistenceState.NEW) {
setPersonType("CUSTOMER");
}
}
...
}

7.5.2 Kalõtõm ve Seçimli (selecting) Sorgular

dil
Bir kalõtõm hiyerarşisi ile eşlenmiş bir tablo üzerinde işlem yaparken , cayenne geriye kök sõnõfa ve onun alt
sõnõflarõna ilişkin satõrlarõ döndürür.Ata sõnõflar geriye dönderilmez.Aşağõda çalõşan(employee) sõnõfõyla ilişkili bir
sorgunun işletimi örneklenmiştir.
va
DataContext context;
...
SelectQuery query = new SelectQuery(Employee.class);
List employees = context.performQuery(query);

// employees listesi sıradan çalışan ve müdürleri içerir


Iterator it = employees.iterator();
ja

while(it.hasNext()) {
Employee e = (Employee) it.next();
if(e instanceof Manager) {
// birşeyerl yap }
}
w.

7.6 Geçerlilik Denetleme

Cayenne veri nesnelerinin içerdiği değerlerin uygulama açõsõndan anlamlõ değerler taşõyõp taşõmadõğõn kontrol
etmek amacõyla bu nesnelerin geçerliliğini kontrol eder. Kõsacasõ içerdikleri değerlerin iş mantõğõna uygunluğunu
denetler.
ww

Cayenne geçerlilik kontrolü için aşağõdaki metodlarõ kullanõr.

public void validateForInsert(ValidationResult validationResult)


public void validateForUpdate(ValidationResult validationResult)

public void validateForDelete(ValidationResult validationResult)


m
public class Painting extends _Painting {
...
protected void validateForSave(ValidationResult validationResult) {

o
super.validateForSave(validationResult);

// iş kurallarını kontrol et
if(getEstimatedPrice().doubleValue() <= 0.0) {

i.c
validationResult.addFailure(
this, // hatanın kaynak nesnesi
Painting.ESTIMATED_PRICE_PROPERTY, // hatanın nitelik adı
"Painting price must be greater than zero.")); //hata mesajı
}
}
...
}

8 Strored-Procedure’lar ile Çalõşmak


dil
Stored-procedure’lar CayenneModeler kullanõlarak yaratõlõr ve PocedureQuery kullanõlarak çalõştõrõlõr.

8.1 Nesnelerin Seçilmesi


va
Eğer stored-procedure’un geriye sadece birtane sonuç kümesi(result set) göndereceği biliniyorsa işletimin normal
bir sorgu işletiminden farkõ yoktur.Aşagõda bir strored-procedure yaratõlamasõ , parametrelerinin geçilmesi ve
işletilmesi gösterilmiştir.

DataContext ctxt;
ja

// "my_procedure" stored-procedure’un ismi,


// DataMap te bulunmalı
ProcedureQuery query = new ProcedureQuery("my_procedure");

// “IN” parametrelerini gir


query.addParam("paramter1", "abc");
w.

query.addParam("parameter2", new Integer(3000));

// sorguyu normal bir seçimli sorgu gibi işlet


List rows = ctxt.performQuery(query);

// sonuçlar
Iterator it = rows.iterator();
ww

while(it.hasNext()) {
Map row = (Map)it.next();

// sonuçlarla birşeyler yap


MyDataObject object = (MyDataObject)ctxt.objectFromDataRow("MyDataObject",
row);
....
}
8.2 Bir Stored Procedure ile Çalõşmak

m
Bir stored-procedure geriye bir veya daha çok sonuç kümesi dönderebilir.Sonuç kümesinin geriye döndüğü
durumlarda QueryResult sõnõfõ kulanõlõr.

8.2.1 Komplex Sonuçlarõ İşlemek için QueryResult Sõnõfõnõ Kullanmak

o
QueryResult sõnõfõ operationObserver sõnõfõndan implemente edilir , bu yüzden
DataContext.performQueries() metodu içiçn ikinci bir parametre olarak kullanõlabilir.
Sorgu işletildikten sonra QueryResult sõnõfõnõn olgusu sorguya ait tüm sonuçlarõ içerir.

i.c
DataContext ctxt;

// "my_procedure" stored procedure ismi,

dil
// DataMap’te bulunması gerek
ProcedureQuery query = new ProcedureQuery("my_procedure");

// ‘IN’ parametre değerlerinin girilmesi


query.addParam("parameter1", "abc");
query.addParam("parameter2", new Integer(3000));

QueryResult resultsCollection = new QueryResult();


va
// sorguyu işlet
ctxt.performQueries(Collections.singleton(query), resultsCollection);

// sonuçları kontrol et

// note that this is a list of lists


// sadece bir result set bekleniyorsa
ja

// resultCollection.getFirstRows(query) kullan
List rowSets = resultsCollection.getRows(query);
Iterator it = rowSets.iterator();
while(it.hasNext()) {
// nextResultSet veri satırları içerecektir
List nextResultSet = (List)it.next();
w.

....
}

List updates = resultsCollection.getUpdates(query);


it = updates.iterator();
while(it.hasNext()) {
ww

Integer nextUpdateCount = (Integer)it.next();


System.out.println("Updated " + nextUpdateCount + " rows.");
....
}
8.3 Stored Procedures ve Transactionlar

m
Bazõ uygulamalarda strored procedure ve transactionlarõ bir arada kullanõlabilir.Bu gibi durumlarda procedure
sorgular transaction’lara sarmalanõrlar.

DataContext ctxt = ...;


ProcedureQuery query = ...;

o
QueryResult resultsCollection = new QueryResult();

// yeni bir ‘external’ transaction olgusu yarat


Transaction externalTransaction = Transaction.externalTransaction(null);

i.c
// transaction ile sorguyu birbirine bağla
Transaction.performQueries(ctxt, Collections.singletonList(query),
resultsCollection);
List results = resultCollection.getFirstRows(query);

9 İfadeleri Kullanmak

9.1 Yol (Path) İfadeleri dil


Cayenne güçlü bir nesne tabanlõ ifade dili tanõmlamõştõr.Cayenne ifadeleri veri tabanõndan bağõmsõzdõr.Cayenne’de
ifadeler belirli kategorilere ayrõlmõştõr.Bunlar aritmetik , koşul ve nesne özelliği içeren ifadeleridir.

İfadelerin nasõl elde edileceğini öğrenmeden önce yol ifadelerini anlamakta fayda var.
Bu tür ifadeler nesne ve veri tabanõ (objectPath , databasePath) yolu ifadeleri olamak üzere ikiye ayrõlõr
va
Bir nesne yolu bir özelllik için tanõmlõ bir yoluolup noktayla birbirinden ayrõlmõş isimlerden oluşur.Örneğin
"toArtist.artistName" Painting sõnõfõ için bir özellik yoludur.Bu sõnõf tarafõndan yaratõlan artist
nesnesinin ismini işaret eder.

Bir veri tabanõ yol ifadesi ise veri tabanõ tablolarõyla yapõlan bileşim (join ) işlemlerinin taranmasõnõ kolaylaştõrõr.
ja

9.2 İfadeleri Türetmek

Expression.fromString(String) metodu ifade elde etmede kullanõlan en basit yoldur.


Aşağõdaki örnekte A yada a ile başlayan ve değeri 1000 den az olan tablolar ifade edilmiştir.
w.

Expression e = Expression.fromString("paintingTitle like 'A%' and


estimatedPrice < 1000");

Tavsiyeler
ww

Karakter sabitlerinden önce ‘\ ‘karakteri kullanõlmalõ


// e1 ve e2 eşdeğer
Expression e1 = Expression.fromString("'ABC'");
Expression e2 = Expression.fromString("\"ABC\"");

Nesne yolu ifadeleri tõrnaksõz katarlardõr.Opsiyonel olarak da obj: ön eki getirilebilir.


m
// nesne yolu
Expression e1 = Expression.fromString("artistName");

// aynı nesne yolu


Expression e2 = Expression.fromString("obj:artistName");

o
// veri tabnı yolu
Expression e3 = Expression.fromString("db:ARTIST_NAME");

i.c
İşlemler parantezler ile guplandõrõlõr.

Expression e1 = Expression.fromString("(estimatedPrice + 250.00) * 3");

...
Map params = new HashMap();
params.put("name", "Dali");
dil
İfaderler parametre alabilir. ($ ile başlayan isimler parameterlerdir.)

Expression template = Expression.fromString("artistName = $name");

Expression e1 = template.expWithParameters(params);
va
...
params.put("name", "Monet");
Expression e2 = template.expWithParameters(params);
ja

9.3 NULL Değerlerin Ele Alõnmasõ

Javadaki null değerlerin ele alõnmasõnõn diğerlerinden farkõ yoktur.SQL deki gibi özel operatörlede kullanõlmaz
(EQUAL_TO , NOT_EQUAL_TO vb.).İfadeler null değerleriyle doğrudan kullanõlõr.
w.

Örneğin

// bu ifade cayenne tarafından sql’e aşagıdaki gibi çevrilir.


// ...WHERE BIRTH_DATE IS NOT NULL
Expression exp = ExpressionFactory.noMatchExp("birthDate", null);
ww

9.4 Bellekte Hesaplama

Where tümcesi kullanõlan sorgularda veri tabanõ bağõmlõlõğõnõ sağlamak için bellekte hesaplama (in memory
evaluation) kullanõlõr.Bir ifade herhangi bir nesne türü ile hesaplanabilir. İfade hesaplama için aşağõdaki metodlar
kullanõlõr.
public Object evaluate(Object object)

m
İfade sonucunu hesaplayõp,sonucu dönderirir

public boolean match(Object object)

Eğer ifade kriterleri karşõlõyorsa true dönderir.

o
public java.util.List filterObjects(java.util.List objects)

Listeden koşullarõ sağlayan liste elemanlarõnõn listesini dönderir.

i.c
public class User extends CayenneDataObject {
public String getName() {
...
}
}
...
public class NonPersistentUser extends Object {

}
...
protected String name;
public String getName() {

}
...
return name;
dil
va
Expression exp = ExpressionFactory.inExp("name", new Object[] {"John",
"Bob"});
User persistentObject;
NonPersistentUser nonPersistentBean;
...
// veri nesnesi kullanrak hesapla
if(exp.match(persistentObject)) {
ja

// bir şeyler yap


}

if(exp.match(nonPersistentBean)) {
// bir şeyler yap
}
w.

10 Performans İyileştirme

10.1 Prefecthing

Prefecthing cayenne bir select sorgusunda nesnenin ilişkili olduğu extra nesneleri getirmek üzere uygulama
ww

alananõnõ genişletmesi.Aşagõdaki öreneği inceleyelim:


1-Esas koşula uygun olan tablo listesini getir
2-Bu listedeki tablo isim değer ve yapan resamlarõn adõnõ bastõr.

İkinci satrõ bize her tablo için “painting.getToArtist()" metodu çağrõlmasõ gerektiğini belirtmektedir.Bu metod
çağrõldõğõnda ise eğer ilgili ressama ilişkin bir nesne bellekte değilse veri tabanõna erişmek gerekecektir.Buda
performansõ olumsuz etkileyecektir.Onun yerine prefecthing yaptõğõmõzda buna gerek kalmaz.
m
SelectQuery query = new SelectQuery(Painting.class);

// "toArtist" ilişkisi için prefecthing kullan


query.addPrefetch("toArtist");

List paintings = ctxt.performQuery(q);

o
10.2 Veri Satõrlarõ

i.c
Veri nesnelerinin yaratõlmasõ ve bir veri baplamõ ile ilişkilendirilmesi maliyetli bir iştir.Kullanõcõ bir arama
yaptõğõnda ise binlerce kayõt gelmekte ama kullanõcõ bunlarõn sadece iki yada üç tanesini kullanmaktadõr.Bu
olumsuzluklarõ engellemek için cayenne’de veri satõrlarõ (dataRows) kullanõlõr.

Veri satrõlarõnõn faydalarõ:

• İki ile beş kat arasõ performans artõşõ





Aynõ DataMap’i kullanõyor olmasõ

dil
Standart cayenne api’sini kullanõyor olmasõ

Veri nesnelerine dönüşümünün kolay olmasõ

import java.util.List;
import java.util.Map;
va
import org.objectstyle.cayenne.access.DataContext;
import org.objectstyle.cayenne.query.SelectQuery;
import org.objectstyle.art.Artist;
...
DataContext ctxt;

// veri satrıları geriye dönderen bir sorgu yarat


ja

SelectQuery q = new SelectQuery(Artist.class);


q.setFetchingDataRows(true);

List artistRows = ctxt.performQuery(q);

// sonuş listesinin elemanları java.util.Map türündendir


w.

Map row = (Map)artistRows.get(0);

// satırı bir artist nesnesine çevir


Artist artist = (Artist)ctxt.objectFromDataRow("Artist", row);
...
ww

10.3 Veri Satõrlarõnõ Sõradan Tarama

Bazen sonuç kümesinin (resultSet )büyüklüğünden dolayõ bellekte yeterince yer olamayabilir.Bu gibi durumlarda
cayenne’in tüm kümeyi (java.sql.ResultSet) okuyup belleğe atmak isteyip sonrada kullanõcõya
döndermesi uygulamanõn kilitlenmesine yol açabilir.
Cayenne bu durumu ResultSet Iterator kullanarak çözmüştür.Iterator her dafasõnda sadece bir veri satõrõnõn geriye
döndürür.Her veri satõrõ ya bir veri nesnesine çevrilir yada doğrudan kullanõlõr.Açõk bõrakõlan ResultSetIterator’lar

m
veri tabanõ bağlantõsõnõ kilitleyeceğinden uygulama kodu tarafõndan kapatõlmalõdõr.

ResultSetIterator her tür sorgu işlemi için kullanõlabilir. Aşağõda örneği verilmiştir.

import java.util.List;

o
import java.util.Map;
import org.objectstyle.cayenne.access.DataContext;
import org.objectstyle.cayenne.access.ResultIterator;
import org.objectstyle.cayenne.query.SelectQuery;

i.c
import org.objectstyle.cayenne.CayenneException;
import org.objectstyle.art.Artist;
...
DataContext ctxt;

SelectQuery q = new SelectQuery(Artist.class);


ResultIterator it = null;

dil
// ResultIterator herzaman CayenneException fırlatır
try {
// "performIteratedQuery" metodu kullanılmalı
it = ctxt.performIteratedQuery(q);

while(it.hasNextRow()) {
// ResultIterator her zaman geriye satırlar dönderir.
Map row = it.nextDataRow();
va
// işlemleri gerçekleştir
...
}
}
catch(CayenneException ex) {
ex.printStackTrace();
}
ja

finally {
try {
// kapatmak mecburi
it.close();
}
w.

catch(CayenneException closeEx) {
closeEx.printStackTrace();
}
}

Eclipse ve Cayenne
ww

Eclipse için gelişltirilmiş bir plug in olmamakla beraber Eclipse’de Cayenne projeleri geliştirmek için aşağõdaki
adõmlarõ yapmak gerekir.

Öncelikle JSDK 1.4 ve eclipse 3.1.1’i kullanmanõz gerekmektedir.


“cayenne/contrib/ide/eclipse/” dizininde bulunan (.classpath and .project) dosyalarõnõ
cayenne kök klasörüne kopyalayõn.Daha sonra projeyi Eclipse dahil edin(import)
Web projelerinde cayenne’le beraber gelen jar dosyalarõnõ “WEB-INF/lib/” dizinine kopyalayõn.

You might also like