spring集成hibernate于struts最新版本的配置,其中spring配置基于xml+注解的方式实现,即数据集采用xml方式的bean配置,而一些service类则采用基于注解的,持久类也采用基于注解的方式实现。
首先是web.xml的配置:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 <welcome-file-list> 8 <welcome-file>login.jsp</welcome-file> 9 </welcome-file-list> 10 <context-param> 11 <param-name>log4jConfigLocation</param-name> 12 <param-value>/WEB-INF/log4j.properties</param-value> 13 </context-param> 14 <context-param> 15 <param-name>log4jRefreshInterval</param-name> 16 <param-value>60000</param-value> 17 </context-param> 18 <listener> 19 <listener-class> 20 org.springframework.web.util.Log4jConfigListener 21 </listener-class> 22 </listener> 23 <!-- end --> 24 <!-- 配置spring 默认在WEB-INF下 --> 25 <context-param> 26 <param-name>applicationContext</param-name> 27 <param-value>/WEB-INF/applicationContext.xml</param-value> 28 </context-param> 29 <!-- 声明web容器监听器不支持监听器就用servlet --> 30 <listener> 31 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 32 </listener> 33 <filter> 34 <filter-name>struts2</filter-name> 35 <filter-class> 36 org.apache.struts2.dispatcher.FilterDispatcher 37 </filter-class> 38 <init-param> 39 <param-name>config</param-name> 40 <param-value>struts-default.xml,struts-plugin.xml,../struts.xml</param-value> 41 </init-param> 42 </filter> 43 <filter-mapping> 44 <filter-name>struts2</filter-name> 45 <url-pattern>/*</url-pattern> 46 </filter-mapping> 47 <filter> 48 <filter-name>encodingFilter</filter-name> 49 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 50 <init-param> 51 <param-name>encoding</param-name> 52 <param-value>UTF-8</param-value> 53 </init-param> 54 <init-param> 55 <param-name>forceEncoding</param-name> 56 <param-value>true</param-value> 57 </init-param> 58 </filter> 59 <filter-mapping> 60 <filter-name>encodingFilter</filter-name> 61 <url-pattern>/*</url-pattern> 62 </filter-mapping> 63 </web-app>
注意日志文件的配置必须在spring容器之前,因为spring容器启动需要开启日志文件,25-28行的配置不写也可以系统默认的spring配置文件
applicationContext.xml就在WEB-INF目录下
applicationContext.xml的内容如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 7 <import resource="spring/application-hibernate.xml"/> 8 <import resource="spring/application-bean.xml" /> 9 </beans>
可以看出这种分层次的配置可以使结构更加明晰,即集成orm单独写成一个配置,集成其他bean再写成另外的配置,当然因为这里后者采用的是基于注解的方法所以8行配置文件的
内容暂时为空,可以扩展.下面具体看7行文件配置
WEB-INF/spring/application-hibernate.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee" 7 xsi:schemaLocation=" http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 9 http://www.springframework.org/schema/context 10 http://www.springframework.org/schema/context/spring-context-3.0.xsd 11 http://www.springframework.org/schema/tx 12 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 13 http://www.springframework.org/schema/aop 14 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 15 http://www.springframework.org/schema/jee 16 http://www.springframework.org/schema/jee/spring-jee-3.0.xsd" 17 default-autowire="byName" default-lazy-init="true"> 18 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 19 <property name="location" value="/WEB-INF/jdbc.properties" /> 20 </bean> 21 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 22 <property name="driverClassName" value="${jdbc.driverClassName}"></property> 23 <property name="url" value="${jdbc.url}" /> 24 <property name="username" value="${jdbc.username}" /> 25 <property name="password" value="${jdbc.password}" /> 26 </bean> 27 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 28 <property name="dataSource" ref="dataSource" /> 29 <property name="packagesToScan"> 30 <list> 31 <value>com.hrbourse.application.model</value> 32 <value>com.hrbourse.hr.model</value> 33 </list> 34 </property> 35 <property name="hibernateProperties"> 36 <props> 37 <prop key="hibernate.dialect"> 38 <!-- Oracle org.hibernate.dialect.Oracle10gDialect --> 39 <!-- MySql--> org.hibernate.dialect.MySQLDialect 40 </prop> 41 <!--<prop key="hibernate.hbm2ddl.auto">create</prop> --> 42 <prop key="hibernate.show_sql">true</prop> 43 <prop key="hibernate.format_sql">true</prop> 44 <prop key="hibernate.jdbc.batch_size">30</prop> 45 <prop key="hibernate.default_batch_fetch_size">30</prop> 46 <prop key="hibernate.query.substitutions">true 1, false 0</prop> 47 <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> 48 <prop key="hibernate.cache.use_second_level_cache">true</prop> 49 <prop key="hibernate.cache.use_query_cache">true</prop> 50 <prop key="hibernate.cache.configurationResourceName">/WEB-INF/ehcache.xml</prop> 51 </props> 52 </property> 53 </bean> 54 <!--Hibernate TransactionManager --> 55 <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 56 <property name="sessionFactory" ref="sessionFactory" /> 57 </bean> 58 <tx:annotation-driven transaction-manager="transactionManager"/> 59 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 60 <property name="dataSource" ref="dataSource"></property> 61 </bean> 62 63 <!-- 事务增强切面 将com.feiling.dao下以Dao结尾的类纳入事务管理--> 64 <aop:config> 65 <aop:pointcut id="daoMethod" expression="execution(* com.hrbourse.*.dao.*(..))"/> 66 <aop:pointcut id="utilMethod" expression="execution(* com.hrbourse.*.util.*(..))"/> 67 <aop:advisor pointcut-ref="daoMethod" advice-ref="txAdvice"/> 68 <aop:advisor pointcut-ref="utilMethod" advice-ref="txAdvice"/> 69 </aop:config> 70 <!-- 事务增强切面END --> 71 <!-- 事务增强 --> 72 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 73 <tx:attributes> 74 <tx:method name="get*" read-only="true" /> 75 <tx:method name="add*" rollback-for="Exception"/> 76 <tx:method name="update*"/> 77 <tx:method name="remove*"/> 78 <tx:method name="save*"/> 79 </tx:attributes> 80 </tx:advice> 81 <!-- 事务增强END --> 82 <!-- <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">--> 83 <!-- <property name="sessionFactory" ref="sessionFactory"></property>--> 84 <!-- </bean>--> 85 <context:component-scan base-package="com.hrbourse.*" /><!-- 需要扫描的基类包,Spring容器将会扫描这个基类包里的所有类,并从类的注解信息获得 --> 86 </beans>
default-autowire="byName" default-lazy-init="true"开头的这两个配置,一个是自动装配,就是比如你定义的Service类标注了@Service("appupService"),那么你在action调用它的
时候只需要定义private AppupServiceImpl appupService;然后加上set,get方法就能获取这个实现类的对象了,后面的配置则是延迟加载,注意看第18行这里spring从我们额外配置的
/WEB-INF/jdbc.properties文件中读书数据源,这样做无疑可以更方便我们对资源文件的解耦,想改是直接改配置文件就好了其他什么都不动
/WEB-INF/jdbc.properties:
1 #Mysql 2 jdbc.driverClassName=com.mysql.jdbc.Driver 3 jdbc.url=jdbc:mysql://localhost:3306/hrborse 4 jdbc.username=root 5 jdbc.password=root
注意看29-34行,这里是扫描注释了的持久类,这样写在这些包里的每个带注解的持久类就能被使用hibernate注解的一个持久类实例
1 package com.hrbourse.hr.model; 2 3 import java.util.Date; 4 import javax.persistence.AttributeOverride; 5 import javax.persistence.AttributeOverrides; 6 import javax.persistence.Column; 7 import javax.persistence.EmbeddedId; 8 import javax.persistence.Entity; 9 import javax.persistence.Table; 10 import javax.persistence.Temporal; 11 import javax.persistence.TemporalType; 12 13 14 @Entity 15 @Table(name="tb_hr_jobpost" 16 ,catalog="hrborse" 17 ) 18 19 public class JobPost implements java.io.Serializable { 20 21 22 23 private static final long serialVersionUID = 1L; 24 private JobPostId id; 25 private String positionnature; 26 private Integer recruitingnumbers; 27 private String special; 28 private String privacy; 29 private Date publishtime; 30 private Integer toemploynum; 31 private Integer positionnum; 32 private String state; 33 34 35 36 public JobPost() { 37 } 38 39 public JobPost(JobPostId id) { 40 this.id = id; 41 } 42 43 44 45 @EmbeddedId 46 @AttributeOverrides( { 47 @AttributeOverride(name="id", column=@Column(name="id", nullable=false, length=32) ), 48 @AttributeOverride(name="position", column=@Column(name="position", nullable=false, length=32) ) } ) 49 50 public JobPostId getId() { 51 return this.id; 52 } 53 54 public void setId(JobPostId id) { 55 this.id = id; 56 } 57 58 @Column(name="positionnature", length=32) 59 60 public String getPositionnature() { 61 return this.positionnature; 62 } 63 64 public void setPositionnature(String positionnature) { 65 this.positionnature = positionnature; 66 } 67 68 @Column(name="recruitingnumbers") 69 70 public Integer getRecruitingnumbers() { 71 return this.recruitingnumbers; 72 } 73 74 public void setRecruitingnumbers(Integer recruitingnumbers) { 75 this.recruitingnumbers = recruitingnumbers; 76 } 77 78 @Column(name="special", length=32) 79 80 public String getSpecial() { 81 return this.special; 82 } 83 84 public void setSpecial(String special) { 85 this.special = special; 86 } 87 88 @Column(name="privacy", length=32) 89 90 public String getPrivacy() { 91 return this.privacy; 92 } 93 94 public void setPrivacy(String privacy) { 95 this.privacy = privacy; 96 } 97 @Temporal(TemporalType.DATE) 98 @Column(name="publishtime", length=10) 99 100 public Date getPublishtime() { 101 return this.publishtime; 102 } 103 104 public void setPublishtime(Date publishtime) { 105 this.publishtime = publishtime; 106 } 107 108 @Column(name="toemploynum") 109 110 public Integer getToemploynum() { 111 return this.toemploynum; 112 } 113 114 public void setToemploynum(Integer toemploynum) { 115 this.toemploynum = toemploynum; 116 } 117 118 @Column(name="positionnum") 119 120 public Integer getPositionnum() { 121 return this.positionnum; 122 } 123 124 public void setPositionnum(Integer positionnum) { 125 this.positionnum = positionnum; 126 } 127 128 @Column(name="state", length=32) 129 130 public String getState() { 131 return this.state; 132 } 133 134 public void setState(String state) { 135 this.state = state; 136 } 137 138 139 140 141 142 143 144 145 146 147 }
这样写就不必在写那么一大堆配置文件,然后还回到我们的application-hibernate.xml的配置文件85行这里的作用是让spring容器扫描这个路径包含的注解了的实体类,将他们注册到spring容器中以便以后谁用就给谁,实现我们的反转控制或者说依赖注入.关于事务方面小弟也一知半解,希望高人在此指点,感激不尽