28 Eylül 2010 Salı

Statefull, Stateless Session Bean

Beanleri (class) statefull veya stateless yapınca ne oluyor?

Statefull session bean : Statefull kullanıldığı zaman, nesne üyeleri yani class'ın içindevar olan field'lar (alanlar) tek bir session bean'in durumunu temsil eder. Bu durum, istemci oturumu kapatana kadar korunur, değerler hafızada yer alır. Bu duruma Conversational State denir.

Stateless Session Bean : kullanıldığında ise Conversational bir durum yoktur. İstemci session Bean2in metodlarını çağırınca, session bean üyelerinni durumu sadece ilgili metod bitene kadar korunur. Metod bittiğinde ise durum korunmaz.

Stateless session beanler diske yazılmazlar. Bu yüzden de statefull session bean'e göre daha iyi performans sağlarlar.

kaynak : http://www.cyber-warrior.org/FORum/j2ee-istemcileri-clients-_133235,0.cwx

27 Eylül 2010 Pazartesi

Seam annotations

Anladığım, yeni öğrendiğim annotation'lar;

@Name


@Name("componentName")

Class'a verilen ismi belirler. Bu sayede context'te bu isimle cagırabiliriz. Kullanıcı arayüz'de atama ve tanımlama yaparken componentName yazılan yere ne yazılmışsa onu yazarak nesnelerine veya metodlarına ulaşabiliriz. İstenildigi sekilde isimlendirilebilir fakat tek olmalıdır. Class ismiyle aynı olma zorunluluğu yoktur.

@Scope
@Scope(ScopeType.CONVERSATION)
Nesnenin ne kadar süre context'te kalacağını yani yaşam süresini belirler.

Scope Türleri : EVENT, PAGE,CONVERSATION, SESSION, BUSINESS_PROCESS, APPLICATION, STATELESS.

EVENT : Default degerdir. Tek bir istek boyunca yaşar
PAGE : sayfa açık kaldığı sürece yaşar, devam eder.
CONVERSATION : Birkaç sayfadaki bilgiler alınacaksa o sayfalar boyunca yaşar.
SESSION : Oturum kapanıncaya kadar yaşar
BUSINESS_PROCESS :
APPLICATION : uygulama kapanıncaya kadar yaşar.
STATELESS :

~

@In

Context'te inject edilen nesne var ise onun bir instance'ını getirir. Eğer yoksa null döndürür.

@In(create=true)
Inject edilen nesne null olduğunda hata verir. Eer create=true denilirse SEAM o nesnenin bir instance'ını oluşturur.

@Out
Başına @Onut annotation'ı konulan nesne context'te gönderilir ve başka bir yerden aynı nesne @In ile inject edilebilir.

@Factory

Metodlar üzerinde kullanılır. İlgili componentten bağımsız olarak kullanılabilir. Yani herhangi bir yerden verilen isim ile cagrılabilir.



Versiyonlama (@Version)

@Version annotation'ı ile versiyonlama yapabilirsiniz.


@Entity
public class Ogrenci implements Serializable {
private Long id;
private String ad;
private Integer versiyon;

@Id @GeneratedValue
public Long getId() ...

@Version
public Integer getVersiyon() ...

}


Bu sayede aynı anda işlem yapıldığında uyarı verilir. Versiyon kontrolu yapar ve duruma gore işleme devam eder.

Entity Class (@Entity)

Entity class'lar eğer verilerde bir kalıcılık sağlanacaksa oluşturulur. Kalıcılık derken, eğer bir veritabanına veri kaydedeceksek, işte o zaman.

Entity classlar oluşturuldukları isimde, kullandığımız veritabanında bir tablo oluştururlar ve class'ın içinde ki nesneler'de veri tabanındaki o tabloya kolon,alan olarak eklenir.

Eğer tablodaki isminin Entity ismi ile aynı olmasını istemiyorsak;

@Table(name="konulacak_Isim") annotation'ını Entity class'ın başında tanımlarız.


Mesala Öğrenci isimli bir class'ımız olsun.

--

public class Ogrenci{

private String ad;
private String soyad;

//Getter Setter

}

--

Bu normal oluşturulmuş ad ve soyad bilgilerini tutan bir class'tır. Fakat ben bu class'taki alanları veri tabanına da eklemek istiyorum.

Entity class oluşturmak için gerekli olan şartlar;

* Classın başına @Entity annotation'ı eklenmeli
* Serializable implements edilmeli
* Bir identy (id) icermeli ve o id'nin başına da @Id ve @GeneratedValue annotation'ı eklenmeli


@Id : O nesnenin ID olacagını belirtir.
@GeneratedValue : Id' değerinin otomatik olarak artacağını belirtir
---

@Table(name="ogr")
@Entity
public class Ogrenci{

@Id @GeneratedValue
private Long id;
private String ad;
private String soyad;

//Getter Setter

}

@Transient
Entity class'ımıza eklediğimiz herhangi bir nesnesin vertabanında bir karşılığı olmasını istemiyorsak, veri tabanına eklenmesini istemiyorsak o nesnenin başına @Transient annotation'ını eklememiz yeterli olacaktır.


@Entity
public class Ogrenci{

@Id @GeneratedValue
private Long id;
private String ad;
private String soyad;

@Transient
private String ogretmeni;

//Getter Setter

}