今天又花了一天时间做单位的搜索网站,主要是增加权限管理的功能,完成了一部分功能,今天的时间主要花在了,spring中调用hibernate的问题,碰到两个问题。一个是双向多对多关联问题,一个是设置lazy=true时的问题。关于第一个多对多问题,原来是把多对多关联,分解为两个一对多关联,但是在spring中,调用getHibernateTemplate保存对象总是报错,呵呵,错误记不得了。也始终没弄明白什么原因。后来想想就改用,组件类集合来处理多对多关联,也就是用composite-element来映射. 第二个问题当lazy=true时,使用的是延迟加载,如果想在读取对象时显示的调用关联的对象,则在hibernate中要用initialize来显示调用,但是在spring中就会报disconnected session的错。
上网找找资料,终于找到原因和解决的办法,在spring中通过getHibernateTemplate()来调用load和initialize,每一个getHibernateTemplate调用都会新开一个session,调用完就关闭了这个session.所以在第二次调用getHibernateTemplate().initialize来显示调用关联对象时就是报disconnected session的错。找到一个比较简单一点的解决的办法,就是用spring的OpenSessionInView. OpenSessionInViewFilter可以等到请求回到filte以后再把session关掉,在web.xml里面配置一下就好用了:
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
加上这段时就OK了~~虽然今天碰到了一些问题,不过也有不少的收获,希望以后还能继续进步~~~~~