Spring Data JPA

【转载】纯干货,Spring-data-jpa(spring数据持久层解决规范)详解,全方位介绍。

风流意气都作罢 提交于 2019-11-30 16:07:38
本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求。这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring整合的环境中实现。如果需要了解该框架的入门,百度一下,很多入门的介绍。在这篇文章的接下来一篇,会有一个系列来讲解mybatis,这个系列从mybatis的入门开始,到基本使用,和spring整合,和第三方插件整合,缓存,插件,最后会持续到mybatis的架构,源码解释,重点会介绍几个重要的设计模式,这样一个体系。基本上讲完之后,mybatis在你面前就没有了秘密,你能解决mybatis的几乎所有问题,并且在开发过程中相当的方便,驾轻就熟。 这篇文章由于介绍的类容很全,因此很长,如果你需要,那么可以耐心的看完,本人经历了很长时间的学识,使用,研究的心血浓缩成为这么短短的一篇博客。 大致整理一个提纲:   1、Spring-data-jpa的基本介绍;   2、和Spring整合;   3、基本的使用方式;   4、复杂查询,包括多表关联,分页,排序等; 现在开始:   1、Spring-data-jpa的基本介绍:JPA诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,百度百科说是JDK为了实现ORM的天下归一,目前也是在按照这个方向发展,但是还没能完全实现。在ORM框架中

Spring Boot+Spring Data Jpa+DBCP2数据源

夙愿已清 提交于 2019-11-30 05:44:31
Spring Data JPA是Spring Data的一个子项目,它通过提供基于JPA的Repository极大地减少了JPA作为数据访问方案的代码量。 pom.xml文件 父类pom <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xiaolyuh</groupId> <artifactId>spring-boot-student</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>spring-boot-student</name> <!-- 添加Spring Boot的父类依赖,这样当前项目就是Spring Boot项目了。 spring-boot-starter-parent是一个特殊的starter,他用来

技术专题讨论:如何对 JPA 或者 MyBatis 进行技术选型

自作多情 提交于 2019-11-30 02:06:36
在我们平时的项目中,大家都知道可以使用 JPA 或者 Mybatis 作为 ORM 层。对 JPA 和 Mybatis 如何进行技术选型? 下面看看大精华总结如下: 最佳回答 首先表达个人观点,JPA必然是首选的。 个人认为仅仅讨论两者使用起来有何区别,何者更加方便,不足以真正的比较这两个框架。要评判出更加优秀的方案,我觉得可以从软件设计的角度来评判。个人对 mybatis 并不熟悉,但 JPA 规范和 springdata 的实现,设计理念绝对是超前的。软件开发复杂性的一个解决手段是遵循 DDD(DDD 只是一种手段,但不是唯一手段),而我着重几点来聊聊 JPA 的设计中是如何体现领域驱动设计思想的,抛砖引玉。 聚合根和值对象 领域驱动设计中有两个广为大家熟知的概念,entity(实体)和 value object(值对象)。entity 的特点是具有生命周期的,有标识的,而值对象是起到一个修饰的作用,其具有不可变性,无标识。在 JPA中 ,需要为数据库的实体类添加 @Entity 注解,相信大家也注意到了,这并不是巧合。 @Entity @Table(name = "t_order") public class Order { @Id private String oid; @Embedded private CustomerVo customer; @OneToMany

spring data jpa 调用oracle 存储过程

泄露秘密 提交于 2019-11-27 17:16:45
需求:在某张表插入,修改时,调用一个存储过程同步数据 在controller层,XXX.saveOrUpdate(entity);方法的后面, XXX.callXXXX(entity.getId);存储过程接口的定义, 存储过程调用的实现: 在service 定义接口 void callXXXX(String id); 在serviceImpl 实现: 导入: import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; 注入: @PersistenceContext private EntityManager entityManager; 方法实现: @Transactional @Override public void XXXX(String rowId) { //调用无返回参数的存储过程 Query query = entityManager.createNativeQuery("{call XXXX('xxx', '同步业务数据', 'ADA',:rowId)}").setParameter("rowId",rowId); query.executeUpdate(); }

spring Data JPA

ⅰ亾dé卋堺 提交于 2019-11-27 06:39:18
什么是JPA? 全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。 为我们提供了: 1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; 如:@Entity、@Table、@Column、@Transient等注解。 2)JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。 如:entityManager.merge(T t); 3)JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。 如:from Student s where s.name = ? JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。 也就是说: JPA是一套ORM规范,Hibernate实现了JPA规范: 什么是spring data jpa? spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作

Spring boot 中自定义JpaRepository使用

别说谁变了你拦得住时间么 提交于 2019-11-26 15:33:53
普通JpaRepository类 import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface EmployeeRepository extends JpaRepository<Employee,Long>{ } JpaRepository一般的筛选查询,均可以通过 findBy 的形式解决,总的很好用,但是总有一部分的业务查询是需要JpaRepository不能解决的。这个时候,就需要在此基础上面增加自定义的Repository类了。 自定义Repository类 接口类 import java.util.List; public interface EmployeeRepositoryCustom { List<Employee> getFirstNamesLike(String firstName); } 实现类 import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import

聊聊spring data jpa的OpenSessionInView

耗尽温柔 提交于 2019-11-26 15:33:27
序 本文主要研究一下spring data jpa的OpenSessionInView Open Session In View Open Session In View简称OSIV,是为了解决在mvc的controller中使用了hibernate的lazy load的属性时没有session抛出的LazyInitializationException异常;对hibernate来说ToMany关系默认是延迟加载,而ToOne关系则默认是立即加载 JpaProperties spring-boot-autoconfigure-2.1.4.RELEASE-sources.jar!/org/springframework/boot/autoconfigure/orm/jpa/JpaProperties.java @ConfigurationProperties(prefix = "spring.jpa") public class JpaProperties { /** * Additional native properties to set on the JPA provider. */ private Map<String, String> properties = new HashMap<>(); /** * Mapping resources (equivalent to

Spring Boot中建议关闭Open-EntityManager-in-view

余生长醉 提交于 2019-11-25 22:39:47
前言 一天,开发突然找过来说 KLock 分布式锁失效了,高并发情况下没有锁住请求,导致数据库抛乐观锁的异常。一开始我是不信的,KLock是经过线上大量验证的,怎么会出现这么低级的问题呢?然后,协助开发一起排查了一下午,最后经过不懈努力和一探到底的摸索精神最终查明不是 KLock 锁的问题,问题出在Spring Data Jpa的Open-EntityManager-in-view这个配置上,这里先建议各位看官关闭Open-EntityManager-in-view,具体缘由下面慢慢道来 问题背景 假设我们有一张账户表account,业务逻辑是先用id查询出来,校验下,然后用于其他的逻辑操作,最后在用id查询出来更新这个account,业务流程如下: 请求一:查询id =6的记录,此时JpaVersion =6,业务处理,再次查询id =6的记录,JpaVersion =6,然后更新数据提交 请求二:查询id =6的记录,此时JpaVersion =6, 业务处理,此时请求一结束了,再次查询id=6的记录,JpaVersion =6,更新数据提交失败 首先,请求一和请求二是模拟的并发请求,然后问题出在,当请求一事务正常提交结束后,请求二最后一次查询的JpaVersion还是没有变化,导致了当前版本和数据库中的版本不一致二抛乐观锁异常,而KLock锁是加在第二次查询更新的方法上面的

你了解Spring Data JPA的批量插入吗?

陌路散爱 提交于 2019-11-25 22:26:39
实现场景 最近在写一个有关拼团旅游的业务,里面有这样一个逻辑实现:一个拼团活动表Activity对应多个Travel旅游表,travel旅游表要分段存储前端传来的List<TravelSchedulingVO>,Travel表需将每一条数据保存入库,这时候就需要用到批量插入来实现了,由于项目的orm框架使用的是Spring Data JPA,所有我们来讨论一下JPA的批量插入的实现和原理。 Spring Data JPA中保存方法已经帮我们封装好了,有save(),saveAll(),而saveAll()是用来实现数据的批量插入的,我们先看看save和savaAll()这两个方法的源码: save() saveAll() 从源码可以看到,saveAll()批量插入就是循环调用save()方法啊,我们来写个简单的测试插入数据方法试一下: 项目信息: UserController @Controller public class UserController { @Autowired UserRepository userRepository; @PostMapping("/saveall") @ResponseBody public String saveAll() { long start = System.currentTimeMillis(); List<User> list

DDD(十)--仓储

放肆的年华 提交于 2019-11-25 21:48:00
1、引言 DDD中的Repository(仓储):协调领域和数据映射层,利用类似与集合的接口来访问领域对象。——《领域驱动设计-软件核心复杂性应对之道》 仓储是DDD中产生的概念,也就是说,如果应用程序不是基于领域驱动设计的,那在设计中使用仓储是不是会有不合适的地方呢? Eric Evans 在《领域驱动设计-软件核心复杂性应对之道》定义中明确的那样:协调领域和数据映射层,两个关键字领域和数据映射层,这里面的领域是指领域模型(实体和值对象),这是桥的一头,另一头就是数据映射层,也就是我们常说的 ORM 工具。 除了这两个关键词,还有一个动词就是协调,仓储协调的是什么?怎么协调的?这个概念需要明确下,桥的一头-领域模型(主要是实体对象),这个就不多说了,桥的另一头-ORM(对象关系映射),其实仓储协调的是 ORM 中的“O”,也就是对象的概念,它是在数据映射层之上的,是一种概念,而不是一种实现。 2、DDD中的仓储 仓储代表一个聚合的集合,仓储用来存储和删除聚合,但同时提供针对聚合的显式查询以及汇总。 2.1、仓储与数据访问层的区别 仓储限定了只能通过聚合根来持久化和检索领域对象,以确保所有改动和不变性由聚合处理。 仓储通过隐藏聚合持久化和检索的底层技术实现领域层的的持久化无关性(即领域层不需要知道如何持久化领域对象)。 仓储在数据模型和领域模型定义了一个边界。 2.2、仓储举例