2011年11月30日 星期三

org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken

在 weblogic 上使用 hibernate 時,幾乎都會發生此錯誤。
原因為 hibernate 在 parse Name Query 會出問題。
目前已知是 antlr 的問題,hibernate 需要 antlr.jar(2.7.6 or 2.7.7) 但是會跟 weblogic.jar 衝突。而通常 classpath 會先 load 到 weblogic server 內的 jar files. 所以hibernate 會認錯 class file。




方法一
修改 domain 下的 startWeblogic.bin (startWeblogic.sh) , 讓 weblogic 優先載入 antlr 。
由於此修改是針對所有的 container , 所以需要評估可能的影響。

在 ${SAVE_CLASSPATH} 修正載入順序。



方法二
修改 WEB-INF/weblogic.xml加入

<weblogic-web-app>
....
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
....
</weblogic-web-app>

讓 web project 內的 jar 優先使用。



方法三

在 Hibernate 相關檔案加入以下設定

<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>

此方法我還沒試成功過...

沒有留言: