Bugüne kadar sizlere Hibernate teknolojisinin temel özelliklerinden bahsetmeye çalıştım. Bugün de Hibernate kullanırken sıkca karşılaştığımız hatalardan ve bu hataların çözümlerinden bahsedeceğim.
1- Veritabanımızda kolon adı olarak kullandığımız kelimenin anahtar kelime (keyword) olmasından dolayı kaynaklanan hata ve çözümü
Örneğin veritabanı aracımız olan MySQL'de bir tablo oluşturduk ve bu tablonun kolonlarından birisinin adını 'DESC' olarak belirledik ve aşağıdaki gibi kolon adı ve veri tipini oluşturduk.
`DESC`
VARCHAR(255) NOT NULL,
Belirlediğimiz bu kolonumuzu java sınıflarıyla eşlemeyi XML Mapping ya da Hibernate Anotasyonları kullanarak gerçekleştirdik.
XML Mapping ile eşleme
Daha önceki konulardan da hatırlayacağınız üzere veritabanında oluşturduğumuz tablomuzun bilgilerini XML mapping dosyamıza yazıyorduk.
<hibernate-mapping>
<class name="com.example.hibernate.Sirket"
table="Sirket" >
...
<property name="desc"
type="string">
<column name="DESC"
not-null="true" />
</property>
...
</class>
</hibernate-mapping>
Anotasyon kullanarak eşleme
Mapping işlemimizi gerçekleştirirken ikinci bir yöntem olarak Hibernate Anotasyonları'nı kullanıyorduk.
@Column(name
= "DESC", nullable = false)
public String getDesc() {
return this.desc;
}
Yukarıda bahsettiğimiz iki yöntemden birini kullanarak eşleme işlemini gerçekleştirdikten sonra tablomuza yeni bir veri eklemek istediğimizde aşağıdaki gibi bir hata ile karşılaşırız:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
Bu hata bize MySQL'de tablo oluştururken yazım hatası yaptığımızı söyler. Aslında bu hata tablomuzun kolonunu oluştururken anahtar kelime kullandığımız için meydana gelmiştir. Bu hatayı düzeltmek için kolon adı olarak kullandığımız ve aslında anahtar kelime olan 'DESC' kelimesini köşeli parantez içine alarak [DESC] şeklinde yazmamız gerekiyor. Yaptığımız bu değişikliği XML mapping dosyamıza ve Hibernate Anotasyon'umuza uyarlıyoruz ve son halinin aşağıdaki gibi olmasını sağlıyoruz.
XML mapping
<hibernate-mapping>
<class name="com.example.hibernate.Sirket" table="Sirket" >
...
<property name="desc" type="string">
<column name="[DESC]" not-null="true" />
</property>
...
</class>
</hibernate-mapping>
Hibernate Anotasyon
@Column(name = "[DESC]", nullable = false)
public String getDesc() {
return this.desc;
}
2- AnnotationConfiguration sınıfının kullanılması
Hibernate 3.6 versiyonundan önceki versiyonlarda AnnotationConfiguration sınıfı kullanılıyordu fakat 3.6 sürümü ile AnnotationConfiguration sınıfı yerini Configuration sınıfına bıraktı.
Hibernate 3.6 versiyonundan önceki versiyonlarda AnnotationConfiguration sınıfı kullanılıyordu fakat 3.6 sürümü ile AnnotationConfiguration sınıfı yerini Configuration sınıfına bıraktı.
Hibernate 3.6 versiyonu öncesi
import
org.hibernate.cfg.AnnotationConfiguration;
//...
private
static SessionFactory buildSessionFactory() {
try {
return new
AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("SessionFactory oluşturulurken hata meydana geldi." + ex);
throw new
ExceptionInInitializerError(ex);
}
}
Hibernate 3.6 versiyonu ve sonrası
import org.hibernate.cfg.Configuration;
//...
private static SessionFactory buildSessionFactory() {
try {
return new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
System.err.println("SessionFactory oluşturulurken hata meydana geldi." + ex);
throw new ExceptionInInitializerError(ex);
}
}
3-Java.Lang.ClassNotFoundException:Javax.Persistence.Entity hatası
Bu hata Entity sınıfının projemize dahil edilmediğinden kaynaklanır. Eğer projelerimizde bu hatayı alıyorsa J2EE SDK kütüphanesi olan javaee.jar dosyasını projemizin classpath'ine koymayı unutmuşuz demektir. Bu kütüphaneyi projemize dahil ederek hatayı gidermiş oluruz.
javaee.jar dosyasını buradan indirebilirsiniz.
4- AnnotationException: Unknown Id.Generator hatası
Bu hata Entity sınıfının projemize dahil edilmediğinden kaynaklanır. Eğer projelerimizde bu hatayı alıyorsa J2EE SDK kütüphanesi olan javaee.jar dosyasını projemizin classpath'ine koymayı unutmuşuz demektir. Bu kütüphaneyi projemize dahil ederek hatayı gidermiş oluruz.
javaee.jar dosyasını buradan indirebilirsiniz.
4- AnnotationException: Unknown Id.Generator hatası
Eğer veritabanı olarak PostgreSQL kullanıyorsanız ve tablonun Id değerinin anotasyon kullanarak eşlemek istiyorsanız @SequenceGenerator anotasyonunu kullanmanız gerekiyor. Eğer bu anotasyonu kullanmayıp eşleme işlemini aşağıdaki gibi gerçekleştirirsek;
@Id
@Column(name="user_id", nullable=false)
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="account_user_id_seq")
private
int userId;
şu hata ile karşılaşırız:
org.hibernate.AnnotationException: Unknown Id.generator
Yukarıdaki Id eşleme işlemini gerçekleştirirken @SequenceGenerator anotasyonunu kullanırsak yukarıdaki hata ile karşılaşmayız.
@Id
@Column(name="user_id", nullable=false)
@SequenceGenerator(name="my_seq",
sequenceName="account_user_id_seq")
@GeneratedValue(strategy = GenerationType.SEQUENCE
,generator="my_seq")
private int
userId;
Bu yazımda sizlere Hibernate'de en çok rastlanan hatalardan ve bu hataların çözümlerinden bahsettim.
Bu yazımla birlikte Hibernate yazı dizisine son veriyorum. Umarım birlikte geçirdiğimiz bu on haftalık süreç faydalı olmuştur. Görüşmek üzere şimdilik hoşçakalın.