1. pom配置

<properties>
		<version>1.0.0</version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
		<junit.version>4.12</junit.version>
		<mockito.version>1.9.5</mockito.version>
		<dbunit.version>2.4.9</dbunit.version>
		<servlet.api.version>2.5</servlet.api.version>
		<jsp.api.version>2.3.1</jsp.api.version>
		<jstl.version>1.2</jstl.version>
		<spring.version>4.3.18.RELEASE</spring.version>
		<c3p0.version>0.9.2.1</c3p0.version>
		<hsqldb.version>2.2.9</hsqldb.version>
		<slf4j.version>1.7.5</slf4j.version>
		<logback.version>1.0.13</logback.version>
		<orika.version>1.4.3</orika.version>
		<jaxb-api.version>2.2.7</jaxb-api.version>
		<mysql.version>5.1.6</mysql.version>
		<commons-codec.version>1.6</commons-codec.version>
		<commons-lang3.version>3.3.2</commons-lang3.version>
		<commons-httpclient.version>3.0-rc4</commons-httpclient.version>
		<commons-logging.version>1.0.4</commons-logging.version>
		<dom4j.version>1.6.1</dom4j.version>
		<jdom.version>1.1</jdom.version>
		<commons-fileupload.version>1.2.2</commons-fileupload.version>
		<commons-io.version>2.4</commons-io.version>
		<json.version>1.1.41</json.version>
		<pingyin.version>2.5.0</pingyin.version>
		<spring.jpa.version>1.10.11.RELEASE</spring.jpa.version>
		<poi.version>3.9</poi.version>
		<stax.version>1.0.1</stax.version>
		< beans.version>2.6.0</ beans.version>
		<jaxen.version>1.1.4</jaxen.version>
		<jackson.version>2.8.1</jackson.version>
	</properties>

	<dependencies>

		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>


		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>${servlet.api.version}</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>${jsp.api.version}</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>${jstl.version}</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>

		<!-- Spring  work -->
		<dependency>
			<groupId>org.spring work</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
			<scope>compile</scope>
		</dependency>
		
		<dependency>
			<groupId>org.spring work</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.spring work</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- Spring ORM -->
		<dependency>
			<groupId>org.spring work</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
			<scope>runtime</scope>
		</dependency>

		<!-- Spring TX : transaction -->
		<dependency>
			<groupId>org.spring work</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring.version}</version>
			<scope>compile</scope>
		</dependency>
 
		<!-- Spring Test -->
		<dependency>
			<groupId>org.spring work</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>log4j-over-slf4j</artifactId>
			<version>${slf4j.version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${logback.version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
			<version>${logback.version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>javax. .bind</groupId>
			<artifactId>jaxb-api</artifactId>
			<version>${jaxb-api.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>${commons-lang3.version}</version>
		</dependency>
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>${commons-codec.version}</version>
		</dependency>

		<dependency>
			<groupId>commons-httpclient</groupId>
			<artifactId>commons-httpclient</artifactId>
			<version>${commons-httpclient.version}</version>
		</dependency>

		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>${commons-logging.version}</version>
		</dependency>

		<dependency>
			<groupId>dom4j</groupId>
			<artifactId>dom4j</artifactId>
			<version>${dom4j.version}</version>
		</dependency>

		<dependency>
			<groupId>org.jdom</groupId>
			<artifactId>jdom</artifactId>
			<version>${jdom.version}</version>
		</dependency>
		<!-- jackson -->
		<dependency>
			<groupId>com.faster .jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.faster .jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.faster .jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<!-- jackson end -->
		<!-- 文件上传 -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>${commons-fileupload.version}</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>${commons-io.version}</version>
		</dependency>

		<!-- log4j -->

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.16</version>
		</dependency>

		<!-- quartz by:cxl -->
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.1.1</version>
		</dependency>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz-jobs</artifactId>
			<version>2.2.1</version>
		</dependency>

		<!-- spring-context-support by:cxl -->
		<dependency>
			<groupId>org.spring work</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>jaxen</groupId>
			<artifactId>jaxen</artifactId>
			<version>${jaxen.version}</version>
		</dependency>
		
		<dependency>
        	<groupId>org.spring work.data</groupId>
        	<artifactId>spring-data-jpa</artifactId>
       		<version>1.8.0.RELEASE</version>
    	</dependency>
     	 
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>5.3.7.Final</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>5.3.7.Final</version>
		</dependency>
		
		<dependency>
			<groupId>aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.5.4</version>
		</dependency>
		 >
		
	</dependencies>

2.spring 配置

<!-- JPA config -->
	<bean id=\"transactionManagerJPA\" class=\"org.spring work.orm.jpa.JpaTransactionManager\">
        <property name=\"entityManagerFactory\" ref=\"entityManagerFactory\"/>
    </bean>
	<tx:annotation-driven  transaction-manager=\"transactionManagerJPA\" proxy-target-class=\"true\" />
	
	<!-- 使用cglib进行动态代理 -->
    <aop:aspectj-autoproxy proxy-target-class=\"false\" />
    <!-- dao -->
    <jpa:repositories  -package=\"com.**.test\" repository-impl-postfix=\"Impl\" 
    entity-manager-factory-ref=\"entityManagerFactory\" transaction-manager-ref=\"transactionManagerJPA\" />
    
    <!-- 实体管理器 
     <property name=\"persistenceProvider\">
            <bean class=\"org.hibernate.ejb.HibernatePersistence\" />
        </property>
    -->
    <bean id=\"entityManagerFactory\" class=\"org.spring work.orm.jpa.LocalContainerEntityManagerFactoryBean\">
        <property name=\"dataSource\" ref=\"dataSource\" />
        <property name=\"packagesToScan\" value=\"com.**.test\" />
        <property name=\"jpaVendorAdapter\">
            <bean class=\"org.spring work.orm.jpa.vendor.HibernateJpaVendorAdapter\">
                <property name=\"generateDdl\" value=\"false\" />
                <property name=\"data \" value=\"MYSQL\" />
                <property name=\"data Platform\" value=\"org.hibernate.dialect.MySQL5InnoDBDialect\" />
                <property name=\"showSql\" value=\"true\" />
            </bean>
        </property>
        <property name=\"jpaDialect\">
            <bean class=\"org.spring work.orm.jpa.vendor.HibernateJpaDialect\" />
        </property>
        <property name=\"jpaPropertyMap\">
            <map>
                <entry key=\"hibernate.query.substitutions\" value=\"true 1, false 0\" />
                <entry key=\"hibernate.default_batch_fetch_size\" value=\"16\" />
                <entry key=\"hibernate.max_fetch_depth\" value=\"2\" />
                <entry key=\"hibernate.generate_statistics\" value=\"true\" />
                <entry key=\"hibernate.bytecode.use_reflection_optimizer\" value=\"true\" />
                <entry key=\"hibernate.cache.use_second_level_cache\" value=\"false\" />
                <entry key=\"hibernate.cache.use_query_cache\" value=\"false\" />
            </map>
        </property>
    </bean>
    
    <!-- 事务 -->
    <tx:advice id=\"txAdvice\" transaction-manager=\"transactionManagerJPA\">
        <tx:attributes>
            <tx:method name=\"*\" />
            <tx:method name=\"get*\" read-only=\"true\" />
            <tx:method name=\"find*\" read-only=\"true\" />
            <tx:method name=\"select*\" read-only=\"true\" />
            <tx:method name=\"delete*\" propagation=\"REQUIRED\" />
            <tx:method name=\"update*\" propagation=\"REQUIRED\" />
            <tx:method name=\"add*\" propagation=\"REQUIRED\" />
            <tx:method name=\"insert*\" propagation=\"REQUIRED\" />
        </tx:attributes>
    </tx:advice>
    <!-- 事务入口 -->
    <aop:config>
        <aop:pointcut id=\"allServiceMethod\"  =\"execution(* com.test..*Service.*(..))\" />
        <aop:advisor pointcut-ref=\"allServiceMethod\" advice-ref=\"txAdvice\" />
    </aop:config>

3. 引用说明

详细实现步骤可以参考 https://www.cnblogs.com/dreamroute/p/5173896.html

JpaRepository接口相关可以参考 https://blog.csdn.net/fly910905/article/details/78557110

4. 问题总结

   (1) Spring data jpa 对常用的增删改查还是非常方便,对于动态SQL查询则不太方便和有一定的学习成本,当然这也是它ORM模式的特点

   (2) 配置pom时需要注意spring、spring data jpa 、hibernate的版本组合,本文第一点中的版本为可用组合版本

    (3) 如何将JpaRepository接口 和 实现类(用实现类的方法体来实现复杂的动态SQL)进行灵活组合? 如果能这样它就完美了

收藏 打印