Spring Data JPA

Spring Data JPA 自动建表字段顺序优化

夙愿已清 提交于 2019-12-22 18:37:27
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> JPA 自动建表字段顺序优化 1、表字段顺序和实体类定义字段顺序一致 原理:复制一个 hibernate 包下的 PropertyContainer 类,修改其中 persistentAttributeMap 的类型,TreeMap 修改为有序的 LinkedHashMap,在下次类加载时,会优先加载我们定义的类。 代码片段 2、自定义继承类字段顺序 原理同上就不说了。 一般我们的实体类会继承一个父类,父类中有 id,createTime,createUser,...,deleteFlag等字段。但是又不想让这些字段都在表字段最前边,或者说 id 在最前边就好了,其他字段放最后边就行。 打断点,跟代码,找到了 InheritanceState,同样覆写下 修改前:id,createTime,createUser,...,deleteFlag,其他字段 修改后:id,其他字段,createTime,createUser,...,deleteFlag if (elements.size() > 6 && "id".equals(elements.get(0).getPropertyName()) && "deleteFlag".equals(elements.get(5).getPropertyName())) {

集成spring-data-jpa和spring-data-redis

五迷三道 提交于 2019-12-18 22:34:01
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 这两天在想在项目中使用spring-data-redis没想到和已存在的spring-data-jpa冲突了,启动报错,原因是spring-data-jpa和spring-data-redis都使用了共同的CrudRepository接口导致Spring无法判断哪些Repository由jpa管理哪些由redis管理,解决办法在spring-data-jpa的文档中https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.multiple-modules import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; /* * 使用多个spring data时需要使用严格模式来指定包路径,通配符的方式无法区分 */ @Configuration @EnableJpaRepositories(basePackages = "test.repositories.jpa")

Spring Data JPA 必须掌握的 20+ 个查询关键字

吃可爱长大的小学妹 提交于 2019-12-11 15:53:21
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 又是小师弟的投稿,确是一个喜欢技术的朋友。以下为原文: 今天闲的无聊看 Spring Data JPA 官方文档的时候,发现并没有完整的 Jpa 关键字语义翻译。所以今天写了一篇中文文档,如果有错误,望大家轻喷。 以下为官方图片以及示例代码和注释 : 首先参照官方文档创建指定数据库 CREATE TABLE `demo_jpa` ( `id` int(11) NOT NULL AUTO_INCREMENT, `first_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `last_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `sex` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `email` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `age` int(12) NOT NULL, PRIMARY KEY (`id`) USING

使用Spring Data JPA的Specification构建数据库查询

孤街醉人 提交于 2019-12-10 14:32:06
Spring Data JPA最为优秀的特性就是可以通过自定义方法名称生成查询来轻松创建查询SQL。Spring Data JPA提供了一个Repository编程模型,最简单的方式就是通过扩展JpaRepository,我们获得了一堆通用的CRUD方法,例如save,findAll,delete等。并且使用这些关键字可以构建很多的数据库单表查询接口: public interface CustomerRepository extends JpaRepository<customer, long> { Customer findByEmailAddress(String emailAddress); List<customer> findByLastname(String lastname, Sort sort); Page<customer> findByFirstname(String firstname, Pageable pageable); } findByEmailAddress生成的SQL是根据email_address字段查询Customer表的数据 findByLastname根据lastname字段查询Customer表的数据 findByFirstname根据firstname字段查询Customer表的数据 以上所有的查询都不用我们手写SQL

Spring Data Jpa - 动态查询

我怕爱的太早我们不能终老 提交于 2019-12-05 14:02:55
如何使用Spring Data Jpa帮助我们实现一些复杂的查询呢? 1. 接口分析 我们需要将我们自定义的接口继承一个叫做 JpaSpecificationExecutor 的接口,查看这个接口的源码你会发现,每个方法都有一个Specification<T>类型的参数,其实这个参数就是我们可以进行复杂查询的关键。 public interface JpaSpecificationExecutor<T> { T findOne(Specification<T> spec); List<T> findAll(Specification<T> spec); Page<T> findAll(Specification<T> spec, Pageable pageable); List<T> findAll(Specification<T> spec, Sort sort); long count(Specification<T> spec); } 点进Specification,这也是一个接口,其中只有一个toPredicate方法,这个方法里面我们就可以自定义查询方式,三个参数的用法如下: Root<T> root:查询的根对象,可以从中获取查询的属性 CriteriaQuery<?> query:顶层查询对象,自定义查询的方式 CriteriaBuilder cb:查询的构造器

DDD(十)--仓储

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

spring-boot和JPA多数据源整合

痴心易碎 提交于 2019-12-05 05:22:12
今天弄一下spring-boot和jpa的多数据源整合 Jpa(Java Persistence API)Java持久化API,它是一套ORM规范 只是一套规范 Spring Boot中使用的Jpa实际上是Spring Data Jpa,Spring Data是Spring家族的一个子项目,用于简化SQL和NoSQL的访问,在Spring Data中,只要你的方法名称符合规范,它就知道你想干嘛,不需要自己再去写SQL。实际还是hibernate。 接下来我们简单来弄下,直接 在idea里创建spring-boot工程,勾选web里的web和sql里的JPA和mysql依赖 然后在依赖里,写一下mysql的版本,一般五点几就行了,再添加Druid依赖 依赖如下 <?xml version="1.0" encoding="UTF-8"?> <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<

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

为君一笑 提交于 2019-12-05 04:16:00
实现场景 最近在写一个有关拼团旅游的业务,里面有这样一个逻辑实现:一个拼团活动表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

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

回眸只為那壹抹淺笑 提交于 2019-12-05 02:52:56
前言 一天,开发突然找过来说 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-12-04 06:52:12
Hibernate的基于Entity对象模型的数据ORM映射管理 门槛较高,深度应用比较复杂; 移植性好,兼容不同的数据库的操作; 数据访问层操作简单,基于HQL操作更加面向对象; 级联操作比较方便 Mybatis 的基于原生SQL的数据ORM映射管理 使用简单,便于快速上手; 迁移性太差,基于本地化的原生SQL操作; 访问粒度较小,复杂情况下的使用更佳灵活,方便; 繁琐的SQL维护,尤其是通用性的重复语句; JPA不属于ORM框架,只是一套持久化API使用规范,能够更加灵活方便的管理数据库操作。从一定意义上来讲,吸取了Hibernate和Mybatis各自的优缺点,兼容并举的达到了一个相对完美的平衡。 JpaRepository 基于约定的方法名查询规范: @Query 注解查询规范(支持HQL/SQL): Specification API进行复杂组合条件查询: 附录一个超简单的使用场景事例,用于描述SpringDataJPA的操作(仅用于说明,哈哈哈): Entity和DB的映射文件:UserInfo 应用于业务场景的DTO包装:UserDTO Entity和DTO的映射工具:UserMapper SpringDataJPA数据库操作类:UserRepository 业务逻辑层的Service:UserService 如下提供更加复杂,强大的使用场景实例: 返回列表并排序: