Professional Documents
Culture Documents
Cayenne Skecelİ Wwwjavadilicom
Cayenne Skecelİ Wwwjavadilicom
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.
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.
i.c
Cayenne içerisinde pekçok özellik barõndõrmaktadõr.Bunlar aşağõda belirtilmiştir.Bunlar
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.
m
2.3 Jar dosyalarõ ve gereksinimler
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"/>
<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
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
-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.
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
Ü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.
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.
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.
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 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
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
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.
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
import org.objectstyle.cayenne.conf.BasicServletConfiguration;
ja
import org.objectstyle.cayenne.access.DataContext;
...
HttpSession session;
DataContext context =
BasicServletConfiguration.getDefaultContext(session);
w.
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;
o
}
catch(IllegalStateException ex) {
// Hatayı yakala
....
i.c
}
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).
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.
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)
o
boolean refresh)
i.c
• public int[] performNonSelectingQuery(String name)
import org.objectstyle.cayenne.access.DataContext;
...
DataContext ctxt; //
ja
ctxt.registerNewObject(artist);
w.
İ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
o
import org.objectstyle.cayenne.access.DataContext;
...
i.c
DataContext ctxt;
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;
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; //
// transfer paylaşıldı
dil
DataContext sessionContext =
BasicServletConfiguration.getDefaultContext(session);
List localUserTypes = sessionContext.localObjects(sharedUserTypes);
// 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).
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);
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.
m
public void andQualifier(Expression e)
Varolan bir qualifier’a bir ifadeyi ekleriz (mantõksal ve ile)
o
6.3 Sõralamalarõ Kullanmak
i.c
import org.objectstyle.cayenne.query.SelectQuery;
...
SelectQuery query = new SelectQuery("Artist");
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.
// 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
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");
Ö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);
proto.setDistinct(true);
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.
Ş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
o
rawSelect.setFetchLimit(1000);
i.c
6.5.3 SQLTemplate ile verinin günlenmesi
import org.objectstyle.cayenne.query.SQLTemplate;
...
dil
SQLTemplate rawDelete = new SQLTemplate(Artist.class, "delete from ARTIST",
false);
int[] deleteCounts = dataContext.performNonSelectingQuery(rawDelete);
query.setCachePolicy(GenericSelectQuery.LOCAL_CACHE);
// yinelemeyi kapat
query.setRefreshingObjects(false);
m
SQLTemplate query = new SQLTemplate(Artist.class, true);
...
o
query.setCachePolicy(GenericSelectQuery.SHARED_CACHE);
i.c
query.setRefreshingObjects(false);
// yinelmeye zorla
query.setRefreshingObjects(true);
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
// 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
i.c
// "false" eğer uygunsa önceden cache edilmiş bir sonuç kümesinin
// kullanılmasını belirtir.
List objects = context.performQuery("MySelect", false);
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.
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.
// artisti sil
// painting.setToArtist(null);
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();
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);
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);
newPainting.setEstimatedPrice(new BigDecimal(5000000.0));
m
// ilişkili olduğu artisiti al
Artist artist = firstPainting.getToArtist();
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ü.
package org.objectstyle.art;
dil
public class Painting extends org.objectstyle.art.auto._Painting {
}
va
package org.objectstyle.art.auto;
*/
public class _Painting extends org.objectstyle.art.ArtDataObject {
}
public java.math.BigDecimal getEstimatedPrice() {
return (java.math.BigDecimal)readProperty("estimatedPrice");
}
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;
}
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.
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
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.
if(state == PersistenceState.NEW) {
setPersonType("EMPLOYEE");
}
ww
}
...
}
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");
}
}
...
}
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);
while(it.hasNext()) {
Employee e = (Employee) it.next();
if(e instanceof Manager) {
// birşeyerl yap }
}
w.
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
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ı
}
}
...
}
DataContext ctxt;
ja
// sonuçlar
Iterator it = rows.iterator();
ww
while(it.hasNext()) {
Map row = (Map)it.next();
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.
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;
dil
// DataMap’te bulunması gerek
ProcedureQuery query = new ProcedureQuery("my_procedure");
// sonuçları kontrol et
// 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.
....
}
m
Bazõ uygulamalarda strored procedure ve transactionlarõ bir arada kullanõlabilir.Bu gibi durumlarda procedure
sorgular transaction’lara sarmalanõrlar.
o
QueryResult resultsCollection = new QueryResult();
i.c
// transaction ile sorguyu birbirine bağla
Transaction.performQueries(ctxt, Collections.singletonList(query),
resultsCollection);
List results = resultCollection.getFirstRows(query);
9 İfadeleri Kullanmak
İ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
Tavsiyeler
ww
o
// veri tabnı yolu
Expression e3 = Expression.fromString("db:ARTIST_NAME");
i.c
İşlemler parantezler ile guplandõrõlõr.
...
Map params = new HashMap();
params.put("name", "Dali");
dil
İfaderler parametre alabilir. ($ ile başlayan isimler parameterlerdir.)
Expression e1 = template.expWithParameters(params);
va
...
params.put("name", "Monet");
Expression e2 = template.expWithParameters(params);
ja
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
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
o
public java.util.List filterObjects(java.util.List objects)
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
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
İ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);
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.
dil
Standart cayenne api’sini kullanõyor 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;
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;
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.