SSH是现在常用的几个Java EE框架,第一个S即 Struts ,第二个S即 Spring,H则是Hibernate。关于SSH具体的安装配置和使用网上有很多教程,这里不再赘述,下面主要讲的是最近本人在使用SSH时所遇到的坑。
Hibernate
问题1
|
|
原因在于hibernate4.0在hibernate.cfg.xml配置二级缓存和hibernate3.3有所不同,本例子用的是 Hibernate-core.4.3.6.Final,实际上从4.0开始就不一样,二级缓存的配置对比如下所示:
- 4.0以上配置如下:
|
|
- 3.3配置如下:
|
|
但是如果仅仅是修改上述配置的话,还是会出错,因为要使用二级缓存的话,还需要引用相应的jar包,即 hibernate-release-4.3.6.Final\lib\optional\ehcache 下的 jar 包也要拷贝到 lib 中,否则会出现 Unable to create requested service [org.hibernate.cache.spi.RegionFactory] 的错误。
问题2
|
|
修改 workspace.metadata.plugins\org.eclipse.wst.server.core\servers.xml文件。
|
|
把 start-timeout=”45” 改为 start-timeout=”100” 或者更长。实际部署时每个人遇到的问题可能都会有所不同,按它的出错提示信息仔细分析一般都可以找到原因。
整合SSH
问题1
部署时页面总是出现404错误,最后发现没有引入spring-web.*.jar。
问题2
整合SSH实验中,进行单元测试时总是出现 * java.lang.ClassCastException: com.hui.ssh.model.User$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy的异常,仔细阅读代码并无错误,后来发现原来有两个javassist的jar包,一个是是从struts2中引入,一个是从hibernate中引入,删掉比较旧的javassist jar包即可。
问题3
遇到问题:org.hibernate.LazyInitializationException: could not initialize proxy - no Session
这是由于前端的jsp通过调用后台HibernateTemplate一个实例的Load方法,仅仅获得的是一个类的代理,在其执行前,session已经关闭(事务边界设在service层)。
- 解决方法1:换用get方法,查询数据库数据。(不方便取多个数据)
|
|
使用filter。在web.xml中 加入,并且要放在struts2的filter前。
使用openSessionInViewInterceptor