2. vaka çalışması
2.1. Sorun
Geliştirmek istediğimiz uygulamaya geri dönelim. Aşağıdaki mimariye sahip mevcut bir uygulamadan yola çıkıyoruz:
![]() |
Aşağıdaki konular hakkında daha fazla bilgi edinmek isteyenler için:
- NHibernate: ORM Nhibernate'e Giriş [http://tahe.developpez.com/dotnet/nhibernate/];
- ASP.NET (WebForms) uygulaması ile NHibernate ve Spring: ASP.NET, Spring.NET, NHibernate ve [http://tahe.developpez.com/dotnet/pam-aspnet/] ile üç katmanlı bir web uygulaması oluşturma.
Önceki uygulamayı şuna dönüştürmek istiyoruz:
![]() |
burada EF5, NHibernate'in yerini almıştır. Bu uygulama, EF5'i incelemek için bir bahane niteliğindedir. Spring.NET, hiçbir şeyi bozmadan katmanı kolayca değiştirmemize olanak tanıdığından, Uygulama 2, Uygulama 1 ile aynı [ASP.NET] katmanını kullanacaktır. Bu belge EF5'e ayrıldığından, bu katmanın yazımını açıklamayacağız. Çalıştığını görmek için onu Uygulama 2'ye ekleyeceğiz. Sadece Spring.NET yapılandırma dosyasında yapılması gereken değişiklikleri açıklayacağız.
Vaka çalışması şu şekildedir. Doktorlara, aşağıdaki prensipte çalışan bir randevu alma hizmeti sunmak istiyoruz:
- bir sekreterlik hizmeti, çok sayıda doktor için RV randevu alımlarını üstlenir. Bu hizmet, tek bir kişiye indirgenebilir. Bu kişinin maaşı, RV hizmetini kullanan tüm doktorlar arasında paylaşılır;
- sekreterlik servisi ve tüm doktorlar İnternet’e bağlıdır;
- RV randevuları, sekreterlik ve doktorlar tarafından internet üzerinden erişilebilen merkezi bir veritabanına kaydedilir;
- RV randevu alımı normalde sekreterlik tarafından yapılır. Ancak doktorlar tarafından da yapılabilir. Bu durum özellikle muayene sonunda doktorun hastasına yeni bir RV randevusu vermesi halinde geçerlidir.
RV alma hizmetinin yapısı şu şekildedir:
![]() |
Doktorlar, RV'leri yönetmek zorunda kalmadıkları takdirde verimliliklerini artırırlar. Yeterli sayıda doktor katılırsa, sekreterliğin işletme masraflarına katkıları düşük olacaktır. Uygulamaya [RdvMedecins] adını vereceğiz. Aşağıda, uygulamanın işleyişine ait ekran görüntülerini sunuyoruz.
Uygulamanın ana sayfası şöyledir:

Bu ilk sayfadan itibaren kullanıcı (Sekreter, Doktor) bir dizi işlem gerçekleştirecektir. Bunları aşağıda sunuyoruz. Soldaki ekran, kullanıcının talepte bulunduğu ekranı; sağdaki ekran ise sunucu tarafından gönderilen yanıtı göstermektedir.
![]() |
![]() |
![]() |
![]() |
![]() |
2.2. Veritabanı
NHibernate uygulaması tarafından kullanılan veritabanı, dört tablo içeren bir MySQL5 veritabanıdır:

Bu veritabanı, tüm veritabanlarımızı oluştururken referans olarak kullanılacaktır.
2.2.1. [MEDECINS] tablosu
Bu tablo, [RdvMedecins] uygulaması tarafından yönetilen doktorlar hakkında bilgiler içerir.
![]() | ![]() |
- ID: doktoru tanımlayan numara - tablonun birincil anahtarı
- VERSION: Tablodaki satırın sürümünü tanımlayan numara. Bu sayı, satırda her değişiklik yapıldığında 1 artırılır.
- NOM: doktorun soyadı
- PRENOM: doktorun adı
- TITRE: unvanı (Bayan, Bayan, Bay)
2.2.2. [CLIENTS] tablosu
Farklı doktorların hastaları [CLIENTS] tablosunda kaydedilir:
![]() | ![]() |
- ID: müşteriyi tanımlayan numara - tablonun birincil anahtarı
- VERSION: Tablodaki satırın sürümünü tanımlayan numara. Bu sayı, satırda her değişiklik yapıldığında 1 artırılır.
- NOM: müşterinin adı
- PRENOM: müşterinin adı
- TITRE: unvanı (Bayan, Bayan, Bay)
2.2.3. [CRENEAUX] tablosu
Bu tablo, RV'lerin mümkün olduğu zaman aralıklarını listeler:
![]() |
![]() |
- ID: zaman aralığını tanımlayan numara - tablonun birincil anahtarı
- VERSION: Tablodaki satırın sürümünü tanımlayan numara. Bu sayı, satırda her değişiklik yapıldığında 1 artırılır.
- ID_MEDECIN: Bu zaman diliminin ait olduğu doktoru tanımlayan numara – MEDECINS(ID) sütunundaki yabancı anahtar.
- HDEBUT: zaman aralığının başlangıç saati
- MDEBUT: zaman aralığının başlangıç dakikası
- HFIN: zaman aralığının bitiş saati
- MFIN: zaman aralığının bitiş dakikası
[CRENEAUX] tablosunun ikinci satırı (yukarıdaki [1]'e bakınız), örneğin, 2 numaralı zaman diliminin saat 08:20'de başlayıp 08:40'ta bittiğini ve 1 numaralı doktora ait olduğunu gösterir (Bayan Marie PELISSIER) ait olduğunu gösterir.
2.2.4. [RV] tablosu
Bu tablo, her doktor için ayrılan RV zaman dilimlerini listeler:
![]() |
- ID: RV'i benzersiz şekilde tanımlayan numara – birincil anahtar
- JOUR: RV'in günü
- ID_CRENEAU: RV'in zaman aralığı – [CRENEAUX] tablosundaki [ID] sütunundaki yabancı anahtar – hem zaman aralığını hem de ilgili doktoru belirler.
- ID_CLIENT: Rezervasyonun yapıldığı müşterinin numarası – [CLIENTS] tablosunun [ID] sütunundaki yabancı anahtar
Bu tablo, birleştirilen sütunların değerleri (JOUR, ID_CRENEAU) üzerinde tekillik kısıtlaması içeren bir 'e sahiptir:
[RV] tablosundaki bir satırın değeri (JOUR1, ID_CRENEAU1) değerine sahipse, bu değer başka hiçbir yerde bulunamaz. Aksi takdirde, bu durum aynı hekim için aynı anda iki adet RV'in alınmış olduğu anlamına gelir. Java programlama açısından bakıldığında, veritabanındaki JDBC sürücüsü, bu durum meydana geldiğinde bir SQLException başlatır.
id satırındaki 7 değeri (yukarıdaki [1]'e bakınız), 10/09/2006 tarihinde 10 numaralı zaman dilimi ve 2 numaralı müşteri için bir RV'in rezerve edildiği anlamına gelir. [CRENEAUX] tablosundan, 10 numaralı randevu aralığının 11:00 - 11:20 saat aralığına karşılık geldiği ve 1 numaralı hekime (Bayan Marie PELISSIER) ait olduğu anlaşılmaktadır. [CLIENTS] tablosundan, 2 numaralı müşterinin Bayan Christine GERMAN olduğu anlaşılmaktadır.
Bu vaka çalışması, Java [http://tahe.developpez.com/java/primefaces] başlıklı bir makalenin konusu olmuştur; bu makalede Java için Hibernate ORM kullanılmaktadır.














