Varım o halde yazıyorum…

Hibernate Blob Tipi – Criteria API Example uyuşmazlığı

Aralık 10th 2012 Hibernate, Java

Geçenlerde epeyce vaktimi alan bir hatayı nasıl çözdüğümüzden bahsedeyim. Olur da benzer bir hata ile cebelleşen birileri arar da denk gelir. Üşenme yaz, kullanıcı bilmezse Google bilir.

Bütün mesele bir dosyayı veritabanında BLOB olarak tanımlanmış bir kolona yazmaktı aslında. Dosya içeriğini byte[] tipinde değil de, java.sql.Blob tipinde tanımlamak gerektiğini öğrendim bu arada, aksi durumda eşlemede tip uyuşmazlığı hatası alınıyor.

Entity sınıfı : File.java

...
private Blob fileContent;
//private byte[] fileContent; 
...

Hibernate eşleme(mapping) dosyası : File.cfg.xml

...
<property name="fileContent" type="blob" column="FILE_CONTENT" />
...

(Hibernate Annotation ile aynı hata oluşuyor mu bilmiyorum bu arada)

şeklinde eşledim dosyanın içeriğini. Fakat testleri çalıştırdığımda

java.sql.SQLSyntaxErrorException: ORA-00932:
inconsistent datatypes: expected – got BLOB

şeklinde bir hata ile karşılaştım. Uzunca bir süre debelendikten sonra, basit bir hibernate projesi oluşturup, önce en güncel hibernate kütüphaneleri ile sonra da 3.6 sürümü kütüphaneleri ile test ettim. Herhangi bir sorun olmadan yukarıdaki eşlemelerle dosyayı kaydedebildim. Forumlarda benzer bir sorunla karşılaşmış olanların belirttiği hibernate.cfg.xml‘de çeşitli ayar değişiklikleri yapmak, hibernate ve bağımlı olduğu kütüphanelerin sürümlerini incelemek, debug loglarını satır satır incelemek ve sair derken uzunca bir maratondan sonra oyunun sonunu getirdik, prensesi kurtardık.

Sorunun kaynağı Blob tipi bir alana sahip sınıf için Hibernate Criteria API’nin Example yapısı ile arama yapmak imiş. Böyle bir durumda yukarıdaki gibi bir tip uyuşmazlığı hatası alınıyor. Çözüm olarak ilk akla gelen Blob tipindeki alanı excludeProperty olarak belirtip, kriter listesinin dışında bırakmaktı tabi ki.

...
File file = new File();
file.setName("XFile");
...
//set other file properties
...
//Create an example to search for
Example example = Example.create(file)
//but exclude the property named "fileContent"
                  .excludeProperty("fileContent");  

List<File> results = session.createCriteria(File.class).add(example).list();
...

Muhtemelen benzer hatayı Clob tipi için de verecektir. Akıllarda buluna, gaflete düşülmeye…

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail



gerekli



gerekli - yayımlanmayacak


Yorum Yap & Fikrini Paylaş

İlk defa bir kitap hakkında yazıyorum. Yazmalıydım ama.

Aşkın bütün hallerini, sırlarını, tereddütlerini, çıkmazlarını ve açmazlarını, sevinçlerini, coşkularını, umutlarını, melankolisini ve ızdıraplarını olabildiğince çıplak şekilde ifade eden bir manifestodur gözümde Eylül. Kitabın tanıtım yazısında da söylediği üzere Mehmet Rauf’a tek başına şöhret sağlayan, üstadım dediği Halit Ziya’ya atfettiği eseri.

Olaylardan çok karakterlerin iç dünyalarının dillendirildiği, duyguların […]

Önceki Yazılar

Eclipse’te yüklü eklenti sayısı arttıkça kalabalıklaşıp, göz tırmalar hale gelen iki durumdan kurtulmanın yönteminden bahsedeyim.

Birincisi üst menüdeki buton kalabalığı. Windows->Customize Perspective menüsünden Tool Bar Visibility sekmesinden aktif olarak kullanılan butonlar seçilip, sadece bu butonların görünmesi sağlanabiliyor.

İkincisi de sağ tık menülerindeki seçenek kalabalığı. Yine aynı şekilde Windows->Customize Perspective menüsünün Menu Visibility sekmesinden menülerde hangi öğelerin […]

Sonraki Yazılar

Sharing
Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail