我原来的系统JDK版本是1.5,weblogic是9,最近突然想到把JDK升级到1.6,weblogic升级到10。weblogic10我个人没感觉到功能和稳定性哪些方面增强了。想升级到WEBLOGIC10源于WEBLOGIC控制后台的界面看起来比较顺眼 ,速度也快了不少且不用再破解(ORACLE收购BEA后把许可证那块取消了)。但就这么一个看视简单的问题,也让我弄了好几次。终于被我测试成功了。在调试过程中出现了两个错误让我来回折腾,感觉很不爽。我也在网上查了很多相关的资料。
当我在配置文件hibernate.cfg.xml中增加属性:
增加上述配置文件时在执行删除语句
session.createQuery("delete User u where u.name='Unmi'").executeUpdate();
报如下错误:
org.hibernate.QueryException: query must begin with SELECT or FROM: delete [delete com.unmi.User where u.name='Unmi']
原来旧的HQL语法解析器不支持 delete User 的写法,hibernate2在删除持久化对象时必须写成
session.delete("delete User u where u.name='Unmi'");
然而新的 org.hibernate.Session 的接口方法已去除了 Session.delete(String hql)方法
而取消如下配置属性:
<property name="hibernate.query.factory_class">
org.hibernate.hql.classic.ClassicQueryTranslatorFactory </property>
却又报如下错误:
ClassNotFoundException: org.hibernate.hql.ast.HqlToken
想来想去我所有程序代码是一样的,升级过来没有动过一处代码,唯一区别就JDK版本和WEBLOGIC版本的改变,问题必须从这两方面思考去解决,这种错误肯定是与JDK无关的,从网上查了一些相关的资料大致确定是WEBLOGIC10自带antlr冲突的问题。我在WEBLOGIC目录下搜索antlr,结果在/bea/modules下搜索到两个相关的文件:
com.bea.core.antlr_2.7.7和com.bea.core.antlr.runtime_2.7.7.jar
不管三七二十一,把这两个文件全部干掉,重启服务,运行程序后还是报
org.hibernate.QueryException: query must begin with SELECT or FROM: delete [delete com.unmi.User where u.name='Unmi']的错误,
这个不行我回过头把配置文件
<property name="hibernate.query.factory_class">
org.hibernate.hql.classic.ClassicQueryTranslatorFactory </property>
也取消,重启服务运行程序后一切OK
总结:
我遇到的这个问题在WEBLOGIC9中只要配置如下属性(用2的查询器)即可解决
<property name="hibernate.query.factory_class">
org.hibernate.hql.classic.ClassicQueryTranslatorFactory </property>
在网上大部分都是说采取上面的方法,但升级到10后配置上述属性在删除操作时会出错,这也可能是WEBLOGIC10的一个BUG吧,解决了这个问题也把HIBERNATE完全升级到3了,原来是还用到了HIBERNATE2的查询器,在批量操作时性能会受到一定的影响。