日志文章

2006年08月11日 00:59:25

快速构建Spring+hibernate WEB应用(三)

Spring+hibernate

Spring几乎对hibernate提供了完美的支持。

要在刚创建的Spring工程中加入Hibernate得支持,索要做的工作仅仅是声明一个SessionFactory.用它代替了原来的

 

..代码胜千言!

<bean id="sessionFactory"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

 

<property name="dataSource" ref="dataSource" />

<property name="lobHandler" ref="lobHandler" />

<property name="mappingDirectoryLocations">

<list>

<value>/WEB-INF/classes/mtn/gfkd/spring/model</value>

</list>

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">

${hibernate.dialect}

</prop>

<prop key="hibernate.show_sql">

${hibernate.show_sql}

</prop>

<prop key="hibernate.use_sql_comments">

${hibernate.use_sql_comments}

</prop>

<prop key="hibernate.jdbc.fetch_size">

${hibernate.jdbc.fetch_size}

</prop>

<prop key="hibernate.jdbc.batch_size">

${hibernate.jdbc.batch_size}

</prop>

<!--  prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>-->

<prop key="hibernate.generate_statistics">

${hibernate.generate_statistics}

</prop>

<!-- 使用默认的二级缓存策略之一 Ehcache -->

<prop key="hibernate.cache.use_query_cache">

${hibernate.cache.use_query_cache}

</prop>

<prop key="hibernate.cache.provider_class">

${hibernate.cache.provider_class}

</prop>

</props>

</property>

<property name="eventListeners">

<map>

<entry key="merge">

<bean

class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />

</entry>

</map>

</property>

<!-- 

<property name="jtaTransactionManager" ref="transactionManager"></property>

-->

</bean>

 

<!-- EhCache 管理器,同时指明缓存策略的资源文件-->

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">

        <property name="configLocation">

            <value>classpath:configure/ehcache/ehcache.xml</value>

        </property>

    </bean>

 

 

察看上述的配置文件,可以看出,hibernate的使用被Spring 基本完全接管,我们所使用的SessionFactory只需按需注入即可J

接上上述的配置不完全的地方

可以看到,引用的bean配置如下:

<beanid="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"/>

 

<bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler">

        <property name="nativeJdbcExtractor">

            <ref local="nativeJdbcExtractor"/>

        </property>

    </bean>

OracleClob,Blob字段的处理类,使其可以与普通字段一样进行处理。

<bean id="dataSource"

class="org.springframework.jndi.JndiObjectFactoryBean">

        <property name="jndiName">

            <value>jdbc/pygl</value>

        </property>

    </bean>

数据源的配置。

当然:我们不能忘记MyEclipsehibernate生成工具,将其生成并与SessionFactory的配置匹配,就万事OK拉!

通过以上步骤:

我们发现,现在我们的应用已经拥有了Spring框架和Hibernate工具的支持!

通过SessionFactory的注入,我们就可以利用Hibernate完成业务功能了,通过前面提到的Controllor对业务功能类的引用,一个完整的WEB应用就搭建成功了!!

 

Spring+hibernate 事务

有了Spring,hibernate的事务就有了最优美的解决方案,利用AOPhibernate 事务处理自动包装到方法上,从而使方法里再也不要为事务伤神了。

当然,当事务为一长串的方法连接起来的,怎么办呢?

解决方案:business层,专门完成真正业务逻辑,在一个方法里将刚才的情况封装成一个函数,利用AOP进行事务管理。(本人愚见)

说到方便,当然还是免除所有代码来的最实际了,看事务配置文件如下:

<beanid="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

     </bean>

声明事务管理器

<bean id="abstrcttxproxy"

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

lazy-init="true">

<property name="transactionManager" ref="transactionManager" />

<property name="proxyTargetClass" value="true" />

<property name="transactionAttributes">

<props>

<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>

<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>

<prop key="save*">PROPAGATION_REQUIRED</prop>

<prop key="update*">PROPAGATION_REQUIRED</prop>

<prop key="remove*">PROPAGATION_REQUIRED</prop>

</props>

</property>

 

设置一个事物管理的通用父接口,让其他的需要事务管理又形式一样的声明直接继承,好处是减少了各个节点的事务声明。

<bean id="TUserDAO" parent="abstrcttxproxy">

<property name="target">

<bean class="gfkd.mtn.spring.user.dao.impl.TUserDAOImpl"></bean>

</property>

</bean>

业务逻辑DAO直接继承事务。

写在最后的话,我的这篇文章都是讲的片段,可能没有形成一个工程完整的全貌,却包含了一个起步工程几乎所有的细节(当然除了安全控制),里面当然还是有一些小细节的问题,不过我想大方向正确,成功就不会远了吧!

类别: Spring |  评论(12) |  浏览(3808) |  收藏
一共有 12 条评论
12楼 [匿名]guest 2006年10月24日 16:36:59 Says:
写的很好哦
11楼 [楼主]Spring Hibernate 之路 2006年09月08日 23:19:09 Says:
好长一段时间没有上过了,看到这么大一段异常:)
看你的情况应该是Ehcache的配置路径有点问题
最好还是用粗classpath 路径。
比如就在WEB-INF/classes 下的XML
路径为classpath*:***.xml
10楼 [匿名]guest 2006年08月27日 19:59:23 Says:
我的电邮为:laoyinfl@163.com,请帮我看看这是怎么回事:
[ERROR,[/myacegiTest],http-8080-1] Exception sending context initialized event to listener instance of class org.acegisecurity.ui.session.HttpSessionEventPublisher
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheManager' defined in ServletContext resource [/WEB-INF/applicationContext-security-acegi.xml]: Initialization of bean failed; nested exception is net.sf.ehcache.CacheException: Cannot parseConfiguration CacheManager. Attempt to create a new instance of CacheManager using the diskStorePath "E:\Program Files\Apache Software Foundation\Tomcat 5.5\temp" which is already used by an existing CacheManager. The source of the configuration was URL of file:/E:/Program%20Files/Apache%20Software%20Foundation/Tomcat%205.5/webapps/myacegiTest/WEB-INF/classes/ehcache.xml.
net.sf.ehcache.CacheException: Cannot parseConfiguration CacheManager. Attempt to create a new instance of CacheManager using the diskStorePath "E:\Program Files\Apache Software Foundation\Tomcat 5.5\temp" which is already used by an existing CacheManager. The source of the configuration was URL of file:/E:/Program%20Files/Apache%20Software%20Foundation/Tomcat%205.5/webapps/myacegiTest/WEB-INF/classes/ehcache.xml.
     at net.sf.ehcache.CacheManager.configure(CacheManager.java:248)
     at net.sf.ehcache.CacheManager.init(CacheManager.java:193)
     at net.sf.ehcache.CacheManager.<init>(CacheManager.java:155)
     at net.sf.ehcache.CacheManager.create(CacheManager.java:356)
     at org.springframework.cache.ehcache.EhCacheManagerFactoryBean.afterPropertiesSet(EhCacheManagerFactoryBean.java:71)
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1091)
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:396)
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:233)
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:145)
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:277)
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:313)
     at org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.refresh(AbstractRefreshableWebApplicationContext.java:139)
     at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:252)
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:190)
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3729)
     at org.apache.catalina.core.StandardContext.start(StandardContext.java:4187)
     at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1175)
     at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:527)
     at org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:104)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:524)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
     at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:833)
     at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:639)
     at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1285)
     at java.lang.Thread.run(Unknown Source)
9楼 [匿名]guest 2006年08月24日 13:41:16 Says:
偶正是需要一个简陋的例子,完整的还怕看不懂,我执意要你发过来,坐享其成,是不是有点懒惰?或者LZ的代码有没有版权问题啊:).......
期待中...
gqg@soueast-motor.com
8楼 [楼主]Spring Hibernate 之路 2006年08月24日 12:15:52 Says:
我最近也整理了一下前段时间的一些东西
因为给我们工程组作过一些培训,但是却很难说针对Spring MVC的完整例子,Spring MVC里的控制器也算种类不少,不过简单的例子也还有,不过那真是有点简陋了。
7楼 [匿名]guest 2006年08月24日 09:39:58 Says:
  晕,QQ还是要用的啊,我们公司的业务部门推荐用QQ,可以节省长途电话费,呵呵~
Spring是很强大的,它的MVC只是它众多功能的一小部分,我觉得要掌握Spring还是要从Web框架学起,因为这个是可以马上学以至用的,我们公司现在有一个项目打算用Spring的RMI实现,掌握Spring是当务之急啊
话说回来,J2ee的范围太宽泛了,时刻都在诱惑着你,现在只希望Spring的MVC能象Struts一样实用,非常需要象你这样的高人指点一下
希望能得到一个完整的Spring的例子,如果LZ有,就发到我邮箱吧.

6楼 [楼主]Spring Hibernate 之路 2006年08月23日 23:43:05 Says:
很少用QQ,汗
还是邮件联系好吧
liushl2001@163.com
ps:我觉得Struts框架现在看来有众多不足,但是却是一个流行最广的WEB层框架,用rod的话说,它是一个事实标准,他的简单易用恐怕没有人不会有那么一点点动心。
至于Spring实现的MVC,众说纷纭,我想用什么没有定论,可能你的公司都是Struts,也可能都要求换用Spring MVC。
我想这也是架构师与管理者讨论的一个问题。
5楼 [匿名]guest 2006年08月23日 11:15:26 Says:
LZ可以加我QQ吗?
4楼 [匿名]guest 2006年08月23日 11:06:37 Says:
但是我在JAVA视线论坛上看到一些帖子,觉得Spring 的MVC比STRUTS会好很多,但是一直找不到可以学习的资料,网上搜索到的都是零散的信息,很难整合起来
3楼 [楼主]Spring Hibernate 之路 2006年08月23日 09:57:24 Says:
我想Struts与Spring应该没有冲突吧。
Appfuse不是一个比较标准的Struts+Sring的整合框架吗?
2楼 [匿名]guest 2006年08月23日 09:09:05 Says:
期盼LZ的答复
1楼 [匿名]guest 2006年08月22日 18:30:52 Says:
写得很不错啊,我最近也在苦学怎么用Spring,只是身边的同事Struts都不想学,一个人学习真的很苦难,请问你用的IDE是Eclipse吗?能把你的这个项目压缩后发给我吗?
  感激不尽!
  也希望能与你交朋友
  Email: gqg@soueast-motor.com
  QQ: 52415710
发表评论
看不清楚,换一张