Örneklersek; Arac isimli bir modelimiz olsun.
Arac sınıfımız
public class Arac implements Serializable {
private Long id;
private String plaka;
public Arac() {
}
public Arac(Long id, String plaka) {
super();
this.id = id;
this.plaka = plaka;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPlaka() {
return plaka;
}
public void setPlaka(String plaka) {
this.plaka = plaka;
}
}
Arac tablosu verileri
ID PLAKA
--- -----------
1 34-AB-034
2 34-BC-035
3 34-CD-036
4 34-DE-037
5 34-EF-038
6 34-FG-039
7 34-GH-040
Projemizde, tüm araçları içeren bir List/Map kullandığımızı düşünelim.
List<Arac> aracList = new ArrayList<Arac>();
//hibernate ile çektiğimiz araçları listeye dolduralım
//listeden aradığımız (ve var olduğunu kesin olarak bildiğimiz) aracı istiyoruz
Arac bulunan = aracList.get(new Arac(1L, "34-AB-034"));
Normalde üst kısımda aradığımız aracı bulurduk fakat hibernate kanalı ile elde ettiğimiz modeller için hashcode, her talepte yeniden oluşturuluyor! Tüm nesnelerin temeli olan Object sınıfındaki equals metodu eşitlik karşılaştırmasında hashcode değerine baktığı için equals değeri bu durumda false dönüyor. List ve Map yapılarında bir nesne aranırken equals metodundan faydalanılıyor. Eğer aranan ile bakılanın equals metodları true dönerse aranılan bulunmuş oluyor ve döngü sonlandırılıyor aksi halde aranılan bulunamıyor.
Özetlersek; List ve Map gibi veri yapıları içerisine hibernate kanalı ile doldurduğumuz nesnelerin equals metodunu uygun bir biçimde ezmezsek, List/Map üzerinde yapacağımız aramalarda aradığımızı bulamayabiliriz. En uygun ezme yolunun, List/Map e dolduracağımız entity nin ID alanı kıyaslaması olduğunu düşünüyorum.
Örnek:
public boolean equals(Object obj) {
if (obj != null && obj instanceof Arac) {
if (((Arac) obj).getId().equals(this.id)) {
return true;
}
}
return super.equals(obj);
}
Equals metodunu ezmek yerine hashcode metodu da ezilebilirdi. Hash algoritmaları yazmak equals metodunu ezmekten daha zahmetlidir. hashcode metodunu ezme seçeneğine, gerçekten daha verimli ve lazım olduğunu düşündüğünüz durumlarda bakın derim.
Hiç yorum yok:
Yorum Gönder