JPA Merge() metodu ne zaman kullanılmalı?
JPA with Hibernate kitabinda yazilanlara gore:
1) Varlik gecici(transient) durumdaysa ve Persistence Context tarafindan yonetilmemisse merge() kullanabilirsiniz.
2) Varlik, Persistence Context tarafindan yonetiliyorsa merge() kullanmayın.
2. kurali ihmal etmemenin gerekliligi hakkindaki aciklamalar:
Merging is a crude operation and should be avoided if possible. It first loads an entity instance with the same identifier as the detached instance into the current persistence context, resulting in a database read. Then, the property values from the detached instance are copied onto the properties of the managed instance. The main problem with this operation is that merging clobbers any changes that may have been made to the database record since the detached instance was retrieved (unless object versioning is used). There are other problems as well. If an entity instance with the same identifier as the detached instance has already been loaded into the current persistence context, a non-unique object exception is thrown because the uniqueness contract of entities in a persistence context is violated. You may also run into a lazy loading exception if you hit an uninitialized association on the detached instance during the merge. Avoid merging if at all possible. By using an extending persistence context, entity instances don’t become detached. Therefore, the persistence manager continues to track changes that are made to the entity. When it comes time to synchronize the entity with the database, calling the flush() method will do the trick within the scope of any transaction.
Örnek:
public void updateRepairCost()
{
EquipmentRepairCost erc = (EquipmentRepairCost)equipmentRepairCost[0];
erc.setCost(BigDecimal.valueOf(cost));
//don't need merge() if erc is in managed state
//entityManager.merge(erc);
entityManager.flush();
}
public void insertRepairCost()
{
EquipmentRepairCost erc = new EquipmentRepairCost();
erc.setCost(BigDecimal.valueOf(cost));
entityManager.persist(erc);
entityManager.flush();
}
JAXB: döngüsel bağları XML’de anahtarlma (cyclic reference problem)
Döngüsel Bağ (Cyclic Reference) nedir?

Baba-Cocuk iliskisine sahip siniflarda, bir baba sahip oldugu cocuklarina referans tutarken, cocuk da babasina referans tuttugu durumda döngüsel bağ problemi ortaya cikar. Derleyiciler bu durumu anlayip döngüyü bir sekilde kirabilmektedirler. Asil sorun bu iliskideki nesnelerin XML’e bind edilmesi sirasinda ortaya cikabiliyor. JAXB standardinda bu sorunu ele alma yontemleri bu baglantida gosteriliyor : https://jaxb.dev.java.net/guide/Mapping_cyclic_references_to_XML.html
Flex’te IFrame icerisinde HTML eklemek
Flash dosyamiza dinamik reklam eklemek, ya da bir web sayfasini oldugu gibi gostermek isteyebiliriz.Bunlar icin yapmak istedigimiz sey aslinda iframe Html eklemek. Malesef bir swf icerisine iframe HTML eklemek sadece Flash ve Flex teknolojilerini kullanarak mumkun olmuyor. Ancak eklenmis gibi bir iluzyon yaratmak mumkun.
Bu ilüzyonu yaratmak icin elimizde olan imkanlara bakacak olursak:
- AS3 kodu içerisinden, SWF dosyamizi sarmalayan(wrapper) HTML dosyamizdaki JavaScript kodlarini calistirabiliyoruz. Bunu AS3′ teki ExternalInterface.call(“JSmethodAdi”) seklinde yapiyoruz.
- Javascript ile onceden tanimlanmis bir div elementinin gorunurlugunu(visibility), boyut ve konum bilgilerini degistirebiliyoruz
Yapacagimiz iluzyonu az cok anlamissinizdir. Madem flash’ta HTML eklenmiyor, o zaman AS3 icerisinden Javascript metodlarini kullanarak, koordinat ve boyut bilgilerini parametre olarak verecegim Javascriptten bize bir iframe olusturmasini isteyebiliriz. Peki bu iş bu kadar kolay mi? Malesef degil… Simdi de sorunlara bakacak olursak:
Flash hep en ustte!
Flash dosyalari varsayilan olarak HTML elamanlarini arka plana iter. Yani z-index i diger HTML elemanlarindan buyuk oldugundan diger butun bilesenler flash dosyasinin arkasinda kalir. Bu durumun boyle olmamasini istiyorsak swf dosyamizi HTML sayfamiza gomerken wmode parametresini transparent yapmamız gerekiyor
<param name="wmode" value="transparent">
wmode degeri transparent, ama bir aksilik var!
Flash’in en populer bug’larindan biri wmode degeri transparent iken klavye duzenin varsayilan yani U.S. Keyboard layout yapilmasidir. Bu durumda ı,ş,ç,ğ gibi Türkçe karakterlerini kullanamazsınız. Tarayicidan tarayiciya degismekle birlikte genelde Firefox veya IE de tam olarak calistigi soylenemez. Uygulamanizda chat kismi mevcut ise kullanicilar icin cok buyuk bir sorun teşkil eder. Peki bunun çözümü? Çözümü aslinda yukarida izledigimiz yolun tam tersi. TextInput bilesenlerimiz icin klavye girdilerini Javascript ile okuyup, bunu bilesenimize iletmek. JSTextReader ile kolaylikla bunu halledebilirsiniz. Bu adresten JSTextReader icin ayrintilarini ve kodlarini indirebilirsiniz.
wmode sorunu tamam, şimdi sıra IFrame eklemekte
Bu adima kadar geldiyseniz bu sayfadan HTML iframe nasil ekleyebilirsiniz ogrenebilirsiniz.
Ve sonuç…
Quartz: Job Scheduling

Quartz, iş sıralama(job scheduling) diye tabir ettigimiz belli zamanlarda calisacak belli gorevleri yoneten, bu gorevlerin yasam döngüsünü düzenleyen java teknolojisi. JEE uygulamalarina entegrasyonu da mumkun. Gun sonunda kredi borcunu odemeyenlere SMS gondermek, 2 saatte bir veritabaninin yedegini almak vs. istedigimizde Quartz i uygulamamiza ekleyebiliriz. Quartz ile ilgili daha ayrintili bilgi icin:
soapUI & Netbeans 6.5 ile Web Servis testi
Netbeans, JAX-WS uzerinde web servis gerceklestirimi icin kolayliklar sunmasina ragmen, olusturulan web servislerin test edilmesi adina butunlesik gelen bir araci bulunmamaktadir. Web servisleri test etmek icin soapUI ‘nin Netbeans eklentisini kullanabilirsiniz.
GET vs POST – Kullanim Durumlari
HTML belirtim belgelerinde yazilana gore POST ve GET arasindaki en temel fark. GET metodu kullanildiginda bir formun
verileri URL bilgisi icerisinde kodlanmasi, POST metodunda istemin mesaj kisminda tutularak gonderilmesidir.
Belirtim ayni zamanda bahsi gecen bu metodlarin kullanim durumlari icin de bir oneri getirmektedir. Oneriye gore bilgi getirme islemleri icin(veri okuma) GET kullanilmali, bunun disindaki islemler icin ise (guncelleme, ekleme, siparis verme, e-posta gonderme vb.) POST metodu kullanilabilir.
Yukaridaki ifadeye gore, form gonderme islemimiz şayet sadece kullanicin ekraninda bir degisiklik yaratacaksa, baska bir deyisle, veritabaninda ya da diger kaynaklarda herhangi bir degisiklige sebep olmayacaksa GET kullaniriz. Ornek olarak, bir kutuphane otomasyonunda, form icerisinde girilen Yazar’in kitaplarinin getirilmesi işlemi veritabanimizda sadece okuma işlemi yapiyorsa GET kullanabiliriz.
Peki neden boyle bir ayrima gidilmis? POST yerine GET, GET yerine POST kullanmak mumkun iken farkli kullanim durumlari olusturulmus? Aslinda yine ornek bir senaryodan yola cikalim ve bir su dagitim firmasinin sitesinden 1 tane su siparis verdigimizi dusunelim. Sipariş onaylanmiş ve su firmasi adresimize bir adet suyu gonderiyorken, tarayicinin geri tusuna basip karsimiza gelen siparis formunu hatayla tekrar submit ettigimizi varsayalim. Bu durumda tarayicinin bize bir uyari mesaji sundugunu goruruz cogu zaman.Bu mesajda bize “POST isteminin yeniden gondermek istediginizden emin misiniz?” benzeri bir soru yoneltir.”Evet” deyip devam edersek yeni siparis gonderilmis olacak.Obur taraftan durumun farkinda olan bir kullanici “hayir” diyerek siparisin gonderilmesini iptal edebilir.
Tarayicinin yaptigi iş aslinda, POST istemlerinde kullaniciyi uyaran, hatali islemlere sebep olacak kullanimlardan kullaniciyi haberdar etmek adina yukarida bahsedilen mekanizmayi kullanmaktir. Ayni mekanizma GET icin gecerli degildir. Cunku en basta bahsettigim gibi, GET dis kaynaklarda bir degisiklige yol acmayacak istemler olarak ele alindigindan kullaniciyi uyarmaya gerek gorulmez. Şayet su firmasinin webmasteri POST yerine GET kullanmis olsaydi hicbir uyari gormeden yukaridaki senaryoda ust uste su siparisi verecektik.
POST ve GET arasindaki teknik farklara goz atacak olursak da:
POST
1. Varsayilan oılarak veriler önbellekte(cache) tutulmaz.Veriler her zaman web sunucusundan cekilir.
2. Veri uzunlugu ile ilgili bir kisitlama yoktur. Daha dogrusu web sunucusuna baglidir.
3. Karakter kodlamasi application/x-www-form-urlencoded olarak kolayca yapilabilir.
4. CGI sunucularinda, gelen parametreler STDIN kanalindan okunur.
GET
1.Veriler önbellekte saklanir.
2.Tarayiciya gore degisen maksimum URL uzunluguna gore gonderilebilecek veri uzunlugu bellidir.
3.CGI sunucularda, gelen parametreler QUERY_STRING degiskeni üzerinden okunur.
Özet olarak
- Dış kaynaklarda degisiklige yol acacak durumlarda(veritabaninda degisiklik vb.) POST kullanmali.
- Veri uzunlugu fazla ise POST kullanmali
- Verilerin önbellekte saklanmasini istiyorsaniz GET kullanmali.
- Guvenlik soz konusu ise(Kredi karti numarasi vs.) ve önbellekte durmasini istemiyorsaniz POST kullanmali
- Parametrelerin URL kisminda gorunmesini istemiyorsaniz POST kullanmali
Son olarak, genelde GET metodunun POST metoduna gore daha hizli calistigini(tarayici faktoru vardir) ve yukaridaki kullanim durumlarina gore POST gerektirmeyecek durumlarda GET kullanmanın performansi arttirdigini soylemek istiyorum.
Hibernate ve Transaction Yonetimi
Veritabani uygulamalarinda, CRUD(Create Update Delete) işlemleri yaygın olarak kullanılır. Transaction veritabanindaki verilerin dogru ve diger verilerle tutarli olmasini saglamak icin kullanilan bir yontemdir. Kısacasi “işlem grubu” olarak tanımlanabilir. Bu işlem grubunu oluşturan işlemler veritabaninda yazma/okuma/guncelleme islemleri yapan işlemlerdir genelde.
Transaction temelde begin, commit ve rollback operasyonlarini yapar. Begin ile “birazdan veritabani islemleri yapacagim haberin olsun” diyoruz, Transaction’da “tamam o zaman yaptigin islemleri ben aklima yaziyorum, ama veritabanina hemen yansitmayacam ancak ve ancak zamani gelince yaparim o işi” der.
Transaction begin ile baslatildiktan sonra ve veritabani işlemlerini gerceklestirdikten sonra commit ile “İşlemlerimi hallettim, şimdilik bi işim kalmadi, bu aklina aldigin degisiklikleri artik veritabanina yansit” diyoruz. Transaction da “tamamdir patron” der ve veritabani kayitlari uzerinde yaptigimiz degisiklikler ancak o zaman gercekten yansir. Peki yaptigimiz veritabani islemlerinde biri hataya neden olursa ne olur? İşte o zaman transaction rollback dedigimiz “geri alma” işlemini yaparak aklina aldigi işlemleri iptal eder ve veritabanina hic bir degisiklik yansimamis olur.
Bunun onemi nedir peki? Kritik bir işlem dizisi düşünelim mesela bir banka işlemi. Bu işlem dizisinin adi P olsun ve A,B, C işlemlerinden olussun. Bir transaction baslatilip, sirasiyla A ve B işlemlerini basarili bir sekilde yaptigimizi ancak C isleminde onemli bir hata olustugunu dusunelim. Boyle bir senaryoda P islem dizisinin tümden basarisiz olmasi beklenir ve A,B işlemlerinin sonuclarinin iptal edilmesi, urettikleri degisikliklerin veritabanina yansimamasi istenir. Istedigimiz aslinda transaction’ın rollback ozelligi.
Transaction’ı basit duzeyde ifade ettikten sonra bunu hibernate ile nasil kullanilacagini soylemek de sira. Hibernate bize 3 şekil Transaction Yonetimi sunar. Bunlarin ayrintisini ve konfigurasyonun nasil yapildigini ogrenmek icin buradan okuyabilirsiniz. Ben sadece programci gozuyle bu yontemleri ne zaman ve nasil kullanmamiz gerektiginden bahsedecegim.
1. JDBC Transaction Yonetimi
JDBC Transaction Yonetimi varsayilan ele alma bicimidir. Veritabani duzeyinde ele alinir. Ancak hibernate bize JDBC API’leri ile ugrasmaktansa Session nesnesi ile sarmaladigi transaction nesnesini kullanmamiza izin verir. Bu transaction nesnesini kullanabilmek icin mutlaka bir tane Hibernate Session nesnemiz olmalidir.
try {
//Transaction, Hibernate session nesnesi araciligiyla baslatilir
factory.getCurrentSession().beginTransaction();
// İslem dizisi
factory.getCurrentSession().load(...);
factory.getCurrentSession().persist(...);
//Transaction commit edilir, degisiklikler onaylanır
factory.getCurrentSession().getTransaction().commit();
}
catch (RuntimeException e) {
//Hata durumunda rollback yapilir
factory.getCurrentSession().getTransaction().rollback();
throw e;
}
2. JTA Transaction Yonetimi
Java Transaction API, bir java standardidir. JTA ile ilgili bilmeniz gereken en onemli unsur, dagitik birden cok veritabaniyla uygulamanizin baglantisi varsa JTA kullanmanizin gerekliligidir. Programlama olarak JDBC yonteminden farki transaction nesnesinin JNDI yontemile elde edilmesi, yani bunun icin Hibernate Session nesnesine ihtiyac duymamasidir. Ancak arka planda current session ile JTA transaction’i otomatik olarak birbirine baglanmaktadir.
try {
UserTransaction tx = (UserTransaction)new InitialContext()
.lookup("java:comp/UserTransaction");
tx.begin();
factory.getCurrentSession().load(...);
factory.getCurrentSession().persist(...);
tx.commit();
}
catch (RuntimeException e) {
tx.rollback();
throw e;
}
3. CMT/EJB Transaction Yonetimi
EJB3 dependency injection ile Transaction yonetiminin kodlanmasiyla ilgilenmek istemiyor, bunun arka planda otomatik olarak yapilmasini istiyorsaniz bu yontemi kullanabilirsiniz. Boyle bir durumda asagidaki gibi bir methodun cagrilmasiyla Transaction yaratilmis, sonlanip geri donmesiyle otomatik olarak sonlandirilmistir. Hicbir sekilde Transaction nesnesine mudahale etme imkaniniz bulunmuyor. begin, commit,rollback methodlarini cagirmaniz durumunuda IllegalStateException alirsiniz
@TransactionAttribute(TransactionAttributeType.REQUIRED) public void doSomeWork() { // Do some work factory.getCurrentSession().load(...); factory.getCurrentSession().persist(...); }
Glassfish Hata:ADM5801:Admin server channel creation failed.
Windows XP uzerinde Netbeans 6.7 ile butunlesik gelen glassfish v2′nin baslatilmasi esnasinda alinan bu hata gercekten bir sure bas agritici olmustu benim icin. Hata arastirildiginda genelde XP ortam degiskenlerinden SystemRoot degiskeninin eklenmesi ve sistemdeki Windows dizininin adresinin deger olarak verilmesi gerektiginden bahsediliyor. Ornegin C:\WINDOWS seklinde. Kucuk/Buyuk harf duyarli oldugu icin adresi birebir vermeye ozen gostermelisiniz.
SystemRoot degiskenini ayarlamama ragmen ayni hatayi almaya devam ediyordum. Ingilizce olan XP sistemimde Region/language ayarlarini asagidaki gibi Turkce’den Ingilizceye cevirdikten ve Netbeans’i yeniden baslattiktan sonra glassfish normal bir sekilde baslamisti.Sonuc olarak Glassfish ten bir bug daha
Segmentation Fault Hakkında
Programlamaya yeni baslayan biri icin, can sıkıcı kafa yedirten ve bir o kadar öğretici bir hatadır segmentation fault. Bir süre sonra programınızın bu hatayı almadan çalıştıgını görmek ilerleme kaydettiğinizi ciddi anlamda gösterir.
C ile ilk “Merhaba Dunya” uygulamamıı yazabildikten kısa bir süre sonra, bilgisayar programının genel yapısını öğrenmemi sağlayan bu hata malesef yeni programcı arkadasların korkulu ruyası olmaya devam ediyor
Bu korkuyu tasıyan biri iseniz, asağıda bahsedecegim “segmentation fault” alma sebeplerini okudugunuzda, artık düşmanınızı bir nebze daha tanımış biri olarak yolunuza devam edebileceksiniz
Yine C’den yola cıkalım. Kod içerigi ne olursa olsun, derlenmiş ve çalışabilir hale getirilmiş bir C programının genel yapısı aşağıdaki kısımlardan olusur. (dahası…)
TAG KÜTÜPHANESİ KAVRAMI
Tag Kütüphanesi Nedir?
JSP teknolojisinde, eylemler(actions) nesneleri yaratıp erişebilen ve çıktı akışını etkileyebilen kısımlardır. JSP tanımındaki 6 tane standart eylem, herhangi bir JSP gerçekleştirimi tarafından desteklenmelidir.
Standart eylemlere ek olarak, JSP v1.1 teknolojisi tekrar kullanılabilir modül olarak bilinen özel eylemleri(custom actions) içermektedir. Bir özel eylem, JSP sayfalarında özel bir tag(custom tag) kullanılarak tetiklenir. Tag kütüphanesi genel olarak özel taglerin koleksiyonudur.
Neden Tag Kütüphanesine İhtiyaç Duyulmuştur?
Form işleme, veritabanına,mail ve dizinler gibi diğer kurumsal hizmetlere erişim, ve akış kontrolü gibi görevler, özel eylemler tarafından gerçekleştirilebilir. Özel eylemler kullanılmaya başlanmadan önce, JavaBeans bileşenleri ile birlikte Scriptlet kullanmak, bu görevleri ele almanın temel mekanizmasıydı. Bu yaklaşım JSP sayfalarını daha karmaşık ve bakımını zor hale getirmiştir.
Özel eylemler bu problemi JSP sayfalarında farklı seviyedeki bileşenleri kullanarak çözmektedir. Özel eylemler yinelenen görevleri sarmalayarak, görevlerin birden fazla uygulamada tekrar kullanılmasını sağlamaktadır. Aynı zamanda kütüphane geliştiricileriyle kütüphane kullanıcılarını birbirinden ayırarak verimliliği arttırmaktadır. JSP tag kütüphaneleri, Java dilinde profesyonel olmuş geliştiriciler tarafından oluşturulmuştur. JSP kütüphaneleri, Java diline hakim olmayan, verilere ve diğer kurumsal hizmetlere erişimin ayrıntılarından uzak kalan Web uygulaması tasarımcıları tarafından kullanılabilmektedir. Sonuçta Web tasarımcısının odaklandığı, uygulamanın sunum(presentation) kısmını başarılı bir şekilde gerçekleştirmektir.




bir yorum yazın