Dua hari pusing mikirin session factory dari hibernate.cfg.xml yang gak kebaca di konfigurasi spring. Yap, baru-baru ini saya lagi sibuk jalanin cimande v2 di glassfish (yang alhamdulillah baru jalan lancar setelah dua hari). Ya memang kedengarannya payah, tapi mungkin bisa jadi ada juga yang memiliki nasib mirip seperti saya. Berawal dari kisah buruk itulah dengan hati tulus ikhlas saya berusaha agar teman-teman yang lain tidak mengalami kejadian yang mirip seperti yang saya alami tersebut. Jadi begini awal mula ceritanya, dari mulai kenal cimande sampai saya gede seperti ini belum pernah sekalipun saya coba jalanin ini aplikasi di container selain tomcat (sekarang sudah :D). Kemudian suatu hari muncullah titah dari Pak Bos untuk menjalankan cimande yang terdiri dari komposisi Struts2 + Spring + Hibernate di app server yang bernama Glassfish. 1, 2, 3, beberapa saat lancar-lancar aja (sampai muncul halaman login :P) dan akhirnya hal itupun terjadi. Masalah sederhana, gak mau login. Usut punya usut ternyata database tidak mengembalikan nilai yang diminta oleh client, usut punya usut lagi ternyata hibernate session factory yang diinject oleh spring bernilai kosong alias hibernate.cfg seakan tidak pernah dilahirkan. Anehnya di tomcat lancar-lancar saja, ya saya sadar kalo masalah beginian pasti saya yang salah. Berikut konfigurasi saya sebelumnya
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" p:dataSource-ref="dataSource" p:hibernateProperties="classpath:hibernate.properties"> <property name="eventListeners"> <map> <entry key="merge"> <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" /> </entry> </map> </property> <property name="configLocations"> <list> <value>classpath:hibernate*.xml</value> </list> </property> </bean>
Yes, setelah bertapa beberapa hari akhirnya ketemulah biang errornya (coba tebak yang mana :P) Dan berikut ini konfigurasi setelah saya rubah.
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" p:dataSource-ref="dataSource" p:hibernateProperties="/WEB-INF/classes/hibernate.properties"> <property name="eventListeners"> <map> <entry key="merge"> <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" /> </entry> </map> </property> <property name="configLocations"> <list> <value>/WEB-INF/classes/hibernate*.xml</value> </list> </property> </bean>
Setelah ditelusuri ternyata ketika dijalankan pada glassfish spring tidak mengenali classpathnya di sebelah mana, sehingga harus merujuk langsung ke tempat dimana semua file dicompile yaitu pada /WEB-INF/classes, dan walhasil cimande saya berhasil jalan di glassfish. Nah pertanyaan selanjutnya bagaimana jika saya menaruh file konfigurasinya di dalam jar file? Bagi yang bisa bantu ditunggu komennya di bawah tulisan ini. Semoga bermanfaat…