Hibernate Blob Tipi – Criteria API Example uyuşmazlığı
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…
Son Yorumlar