最近要写一个小的B/S工程,觉得往常的SSH框架实在太过沉重,故决定只用持久层的hibernate加上DWR来实现。编码过程中出现了不少问题,才发现自己的基础还不够扎实。
问题1 Myeclipse自动映射生成的DAO文件缺乏可用性
我使用的是Myeclipse8, 或许是我配置不好,不过就目前情况来看,通过IDE自带的映射文件生成工具生成的DAO是有错误的。因为我的项目中没加入spring,就缺少了spring的事务管理,而在这种情况下,IDE生成的DAO并没有自动加入事务,这直接导致DAO中除了“查”的方法之外,余下的方法都不能正常的执行。因此为了保证可运行,必须手动添加事务。
public void save(Company transientInstance) {
log.debug("saving Company instance");
try {
Transaction ts = getSession().beginTransaction();
getSession().save(transientInstance);
ts.commit();
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
问题2 DWR.xml文件的设置问题
之前做的项目都有spring的存在,而这里没有了,因此dwr.xml文件中的<create creator="spring" javascript="CompanyManager" >的creator要从spring改成new。原来以为这样就没问题了呢,后来发现dwr会出问题,才发现除了修改creator,还需要将<param name="javabean"改成<param name="class",这样就OK了
问题3 自动生成的DAO中findByProperty方法出错,报ClassNotFoundException: org.hibernate.hql.ast.HqlToken
修正了问题1后,发现程序每次调用到findByProperty方法后都直接出现异常被捕获,(这里我的try...catch...写的不好- -,完全看不出是在哪里出的错,只知道在整个try块中有问题)。通过DEBUG,发现抛出的是ClassNotFoundException: org.hibernate.hql.ast.HqlToken异常。上网查了这个异常,绝大多数都是提到是在将hibernate3项目部署到weblogic上的时候会出现的异常,因为一个叫antlr.jar的包冲突了。我到我项目里一查看,果然有个antlr.jar的包。悲剧的是,这个包居然是锁死在整个Hibernate 3 Core Libraries中的,无法单独删除。同时,我的项目也不是部署在weblogic上而是tomcat上的啊。郁闷中偶然网上见到一个方案,让我们在Hibernate.cfg.xml中添加一个属性,尝试一下,果然奏效了,工程正常执行了~
添加的属性:
<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
个人觉得添加到这个属性的作用应该是设定 更改hibernate执行查询时默认调用的类 为另一个类,这样可能就绕开了对antlr.jar包的调用吧(个人感觉吧,不知道真实原因是什么- -)。
by NN 09-11-23 00:53