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)进行灵活组合? 如果能这样它就完美了
继续阅读与本文标签相同的文章
下一篇 :
Android MVP点击商铺切换商品购物车
-
MySQL每组求最值的记录与每组前N条记录
2026-05-18栏目: 教程
-
OCP-052考试题库汇总(55)-CUUG内部解答版
2026-05-18栏目: 教程
-
【云栖活动】架构师、产品经理一对一座谈会/WORKSHOP-已截止
2026-05-18栏目: 教程
-
MySQL入门书籍和方法分享
2026-05-18栏目: 教程
-
树莓派4&阿里云物联网平台上云开发实操
2026-05-18栏目: 教程
