2 Nisan 2009 Perşembe

JPA'da yeni kaydın ID numarasını almak...

JPA ile bir problem çözmeye çalıştığımızı düşünelim. Yeni bir müşteri veya adres defterine yeni bir adres kaydı atmak istiyor olalım. Ve kayıt işleminden hemen sonra kullanılmak üzere bize yeni kaydın ID ( PK ) numarası gerekli olsun.

Bunu diğer yöntemler ile nasıl yapılacağına bir bakalım: Önce kayıt atılır. Sonra veritabanı sunucusu eğer destekliyorsa , örneğin: lastInsertID() gibi bir komutla en son eklenen kaydın ID numarası alınır. Tabi eğer böyle bir komut yok ise ve veritabanı sunucumuz, aletlerimiz transactionı desteklemiyorsa bunun o an eklenen kaydın ID numarası olduğunu ummamız iyimser bir yaklaşım olacaktır. Aynı anda arda arda bir kaç kayıt gelebilir ve elimizdeki ID numarası başka kayıda ait olabilir.

Bunun da çözümleri vardır. Kendi kilit - lock - mekanizmanızı veya veritabanının kilit mekanizmanısını kullanabilirsiniz. Bunun da sakıncalarını, özellikle tablo bazında kilitlemelerin sakıncalarını göreceksiniz. Özellikle bir biri ile dış anahtarlar - FK - ile bağlı tablolara kayıt atarken tablo kitleme bir sonsuz döngüye girebilir. Ve sistem birini feda ederek bu döngüden çıkar. Ama bu işinize yaramaz bir çözümdür.

Ya da kendi kilit mekanizmanızı dolaylı yöntemler ile siz geliştirisiniz. Mesela tablolara birer alan koyarsınız o kayıt kilitli ise o alana bir değer atarsınız. O kayıt ile işlem yapmak isteyenler olursa eriştirmezsiniz böylece...

Tablo kitleme olayı yeni kayıt atarken aldığınız ID numarasının o kayda ait olduğunu garantiler.
Ancak gerekmedikçe tablo kitlememeniz hayrınıza olacaktır. Tablo kitlemeleri sıralara, kuyruklara neden olacağından sistemin performansını düşürür.

Gelelim JPA'da o kaydın ID numarasını nasıl alacağımıza. Öncelikle JPA ORM yazılım iskeletidir. JPA transaction yönetimine sahiptir.


entitymanager.getTransaction().begin();
entitymanager.persist(entitybean);
entitymanager.getTransaction().commit();

int Id = entitybean.getEntityBeanID().intValue();


İşlem bu kadar basittir. Eğer kayıt başarılı ise commit() fonksiyonu veritabanına kayıt işlemini onaylatır. Ve yeni kayıt edilecek olan entitybean nesnesinin ID alanı doğal olarak boştur! Ancak Commit() başarlıysa bu alan JPA tarafından doldurulur. Sizde kolayca bu değeri alırsınız. Ve bilirsiniz ki bu ID kesinlikle o an kaydettiğiniz kayda aittir!

İşte JPA ile hayatınızı kolaylaştıran bir olay daha!!!
Mr. mascule reklamına benzedi biraz ama .... :)