JPA
文章平均质量分 55
jpa
gqltt
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Spring Data JPA 从入门到精通~@PreUpdate异常场景分析
1、执行save()后@PreUpdate不再触发2、3、1、执行save()后@PreUpdate不再触发实体:@Entity@EntityListeners(MyEntityListener.class)class MyEntity{ ... }监听器:class MyEntityListener{ @PrePersist @PreUpdate public void doSomething(Object entity){ ... }原创 2022-02-17 18:19:37 · 1528 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~@EntityListeners注解示例
被@Prepersist注解的方法 ,完成save之前的操作。被@Preupdate注解的方法 ,完成update之前的操作。被@PreRemove注解的方法 ,完成remove之前的操作。被@Postpersist注解的方法 ,完成save之后的操作。被@Postupdate注解的方法 ,完成update之后的操作。被@PostRemovet注解的方法 ,完成remove之后的操作。This page will provide JPA @EntityListeners example .转载 2022-02-17 18:09:15 · 2051 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~思维导图
#原图System.out.println("https://www.processon.com/view/61c7227c0e3e7474fb9b4b76?fromnew=1");原创 2022-01-11 08:45:18 · 415 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~方法的查询策略的属性表达式
方法的查询策略的属性表达式(Property Expressions)属性表达式只能引用托管(泛化)实体的直接属性,如前一个示例所示。在查询创建时,已经确保解析的属性是托管实体的属性,但是,还可以通过遍历嵌套属性定义约束。假设一个 Person 实体对象里面有一个 Address 的属性里面包含一个 ZipCode 属性。在这种情况下,方法名为:List<Person> findByAddressZipCode(String zipCode);创建及其查找的过程是:解析算法首先将原创 2022-01-10 20:38:40 · 301 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~关键字列表
注意除了 find 的前缀之外,我们查看 PartTree 的源码,还有如下几种前缀:private static final String QUERY_PATTERN = "find|read|get|query|stream";private static final String COUNT_PATTERN = "count";private static final String EXISTS_PATTERN = "exists";private static final String原创 2022-01-10 20:36:20 · 739 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~查询方法的创建
查询方法的创建内部基础架构中有个根据方法名的查询生成器机制,对于在存储库的实体上构建约束查询很有用,该机制方法的前缀 find…By、read…By、query…By、count…By 和 get…By 从所述方法和开始分析它的其余部分(实体里面的字段)。感兴趣的读者可以到类 org.springframework.data.repository.query.parser.PartTree 查看相关源码的逻辑和处理方法,关键源码如下:引入子句可以包含其他表达式,例如在 Dis原创 2022-01-10 20:33:42 · 441 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~方法的查询策略设置
方法的查询策略设置通过下面的命令来配置方法的查询策略:@EnableJpaRepositories(queryLookupStrategy= QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)其中,QueryLookupStrategy.Key 的值一共就三个:Create:直接根据方法名进行创建,规则是根据方法名称的构造进行尝试,一般的方法是从方法名中删除给定的一组已知前缀,并解析该方法的其余部分。如果方法名不符合规则,启动的时候会报异常。 USE_原创 2022-01-10 20:31:33 · 293 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~定义查询方法的配置方法
定义查询方法的配置方法由于 Spring JPA Repository 的实现原理是采用动态代理的机制,所以我们介绍两种定义查询方法,从方法名称中可以指定特定用于存储的查询和更新,或通过使用 @Query 手动定义的查询,取决于实际对数据的操作,只需要实体 Repository 继承 Spring Data Common 里面的 Repository 接口即可,就像前面我们讲的一样。如果你想有其他更多默认通用方法的实现,可以选择 JpaRepository、PagingAndSortingReposit原创 2022-01-10 20:29:22 · 204 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~Naming命名策略详解及其实践
Naming 命名策略详解及其实践用 JPA 离不开 @Entity 实体,我都知道实体里面有字段映射,而字段映射的方法有两种:显式命名:在映射配置时,设置的数据库表名、列名等,就是进行显式命名,即通过 @Column 注解配置。 隐式命名:显式命名一般不是必要的,所以可以选择当不设置名称,这时就交由 Hibernate 进行隐式命名,另外隐式命名还包括那些不能进行显式命名的数据库标识符,即不加 @Column 注解时的默认映射规则。Naming 命名策略详解我们通过源码发现:Naming.原创 2022-01-10 20:23:15 · 2589 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~如何配置多数据源
如何配置多数据源在 application.properties 中定义两个 DataSource定义两个 DataSource 用来读取 application.properties 中的不同配置。如下例子中,主数据源配置为 spring.datasource.one 开头的配置,第二数据源配置为 spring.datasource.two 开头的配置。//这是默认配置,我们做一下对比spring.datasource.url=db1spring.datasource.username=原创 2022-01-10 20:21:37 · 527 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~事务的处理及其讲解
默认 @Transactional 注解式事务(1)@EnableTransactionManagement正常情况下,我们是需要在 ApplicationConfig 类加上 @EnableTransactionManagement 注解才能开启事务管理。通过 DataSource 的研究步骤 spring.factories 里面默认加载 TransactionAutoConfiguration 类,而我们看源码,其里面已经加了此注解,默认采用的 AdviceMode.PROXY,所以默认情况的原创 2022-01-10 20:15:38 · 1686 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~AliDruidDataSource的配置
AliDruid 配置方法(1)在实际工作中,由于 HikariCP 和 Druid 应该各有千秋,会发现偏向于监控,有很多国内开发 者使用频次最高的 AliDruid,我们来看看看如何配置。<!--druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <原创 2022-01-09 17:40:38 · 527 阅读 · 1 评论 -
Spring Data JPA 从入门到精通~默认数据源的讲解
默认数据源spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useSSL=falsespring.datasource.username=rootspring.datasource.password=123456但是在实际工作中不可能这么简单,因为会用其他数据源,而不是用的默认数据源。我们先来一步一步了解一下,一起来开启原创 2022-01-09 17:39:19 · 1143 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~@Version处理乐观锁的问题
@Version 处理乐观锁的问题@Version 乐观锁介绍我们在研究 Auditing 的时候,发现了一个有趣的注解 @Version,源码如下:package org.springframework.data.annotation;/** * Demarcates a property to be used as version field to implement optimistic locking on entities. */@Retention(RUNTIME)@Ta原创 2022-01-09 17:26:33 · 2549 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~Auditing及其事件详解
Auditing 及其事件详解Auditing 翻译过来是审计和审核,Spring 的优秀之处在于帮我们想到了很多繁琐事情的解决方案,我们在实际的业务系统中,针对一张表的操作大部分是需要记录谁什么时间创建的,谁什么时间修改的,并且能让我们方便的记录操作日志。Spring Data JPA 为我们提供了审计功能的架构实现,提供了四个注解专门解决这件事情:@CreatedBy 哪个用户创建的。 @CreatedDate 创建的时间。 @LastModifiedBy 修改实体的用户。 @LastM.原创 2022-01-09 16:57:13 · 2612 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~实际工作的应用场景
在实际工作中,有哪些场景会用到自定义 Repository 呢,这里列出几种实际在工作中的应用案例。1. 逻辑删除场景可以用到上面说的两种实现方式,如果有框架级别的全局自定义 Respository 那就在全局实现里面覆盖默认 remove 方法,这样就会统一全部只能使用逻辑删除。但是一般是自定义一个特殊的删除Respository,让大家去根据不同的domain业务逻辑去选择使用此接口即可。2. 当有业务场景要覆盖 SimpleJpaRepository 默认实现的时候这种一般是具体情况具原创 2022-01-09 16:47:45 · 719 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~自定义实现Repository
EntityManager 的获取方式我们既然要自定义,首先讲一下 EntityManager 的两种获取方式。1. 通过 @PersistenceContext 注解。通过将 @PersistenceContext 注解标注在 EntityManager 类型的字段上,这样得到的 EntityManager 就是容器管理的 EntityManager。由于是容器管理的,所以我们不需要也不应该显式关闭注入的 EntityManager 实例。@Repository@Transaction原创 2022-01-09 16:44:58 · 2814 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~EntityManager介绍
EntityManager 介绍我们前面已经无数次提到了,JPA 的默认 Repository 的实现类是 SimpleJpaRepository,而里面的具体实现就是调用的 EntityManager。对于 javax.persistence.EntityManager 通过源码,先来看下它主要给我们提供了哪几个方法:public interface EntityManager { /** *根据主键查询实体对象 */ public <T> T find(Cl原创 2022-01-09 16:42:46 · 3199 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~JpaSpecificationExecutor实现原理
JpaSpecificationExecutor 实现原理我们还是先通过开发工具,把关键的类添加到Diagram上面进行分析,如图:我们通过上图可以看一下,前面介绍的几个类之间的关联关系。SimpleJpaRepository 实现类中的关键源码如下:/** *以 findOne 为例*/public T findOne(Specification<T> spec) { try { return getQuery(spec, (Sort) n原创 2022-01-09 12:46:42 · 8173 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~Specification工作中的一些扩展
Specification 工作中的一些扩展我们在实际工作中会发现,如果上面的逻辑,简单重复写总感觉是不是可以抽出一些公用方法呢,此时引入一种工厂模式,帮我们做一些事情,可以让代码更加优雅。基于 JpaSpecificationExecutor 的思路,我们创建一个 SpecificationFactory.Java 内容如下:public final class SpecificationFactory { /** * 模糊查询,匹配对应字段 */ public st原创 2022-01-09 10:46:28 · 517 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~JpaSpecificationExecutor示例
新建两个实体@Entity(name = "UserInfoEntity")@Table(name = "user_info", schema = "test")public class UserInfoEntity implements Serializable { @Id @Column(name = "id", nullable = false) private Integer id; @Column(name = "first_name", nullable =原创 2022-01-09 10:42:31 · 382 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~Criteria概念的简单介绍
(1)Root<T> root代表了可以查询和操作的实体对象的根,如果将实体对象比喻成表名,那 root 里面就是这张表里面的字段,这不过是 JPQL 的实体字段而已。通过里面的 Path<Y> get(String attributeName),来获得我们想操作的字段。(2)CriteriaQuery<?> query代表一个 specific 的顶层查询对象,它包含着查询的各个部分,比如 select 、from、where、group by、orde原创 2022-01-08 13:58:58 · 2299 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~JpaSpecificationExecutor的使用方法
JpaSpecificationExecutor 源码和 API我们也可以通过 idea 工具详细看其用法和实现类,JpaSpecificationExecutor 是 Repository 要继承的接口,而 SimpleJpaRepository 是其默认实现。而通过源码来看其提供的 API 比较简单、明了,有如下几个方法:public interface JpaSpecificationExecutor<T> { //根据 Specification 条件查询单个对.原创 2022-01-08 13:57:57 · 1358 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~QueryByExampleExecutor的使用
QueryByExampleExecutor 的使用按示例查询(QBE)是一种用户友好的查询技术,具有简单的接口,它允许动态查询创建,并且不需要编写包含字段名称的查询。从 UML 图中,可以看出继承 JpaRepository 接口后,自动拥有了按“实例”进行查询的诸多方法,可见 Spring Data 的团队已经认为了 QBE 是 Spring JPA 的基本功能了,继承 QueryByExampleExecutor 和继承 JpaRepository 都会有这些基本方法,所以 QueryByExa.原创 2022-01-08 13:03:51 · 2818 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~JpaRepository介绍
从 JpaRepository 开始的子类,都是 Spring Data 项目对 JPA 实现的封装与扩展。JpaRepository 本身继承 PagingAndSortingRepository 接口,是针对 JPA 技术的接口,提供 flush()、saveAndFlush()、deleteInBatch()、deleteAllInBatch() 等方法。我们来看一下 UML 来对 JpaRespository 有个整体的认识。从图中其实可以发现,JPA 的实现类最关键是:Simple原创 2022-01-08 12:59:47 · 1281 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~基本注解
@Entity、@Table、@Id、@GeneratedValue、@Basic、@Column、@Transient、@Lob、@Temporal先看一个 Blog 的案例其中实体的配置如下:@Entity@Table(name = "user_blog", schema = "test")public class UserBlogEntity { @Id @Column(name = "id", nullable = false) @GeneratedValue(st.原创 2022-01-08 12:36:44 · 604 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~javax.persistence概况介绍
虽然 Spring Data JPA 已经对数据的操作封装的很好了,约定大于配置的思想,帮我们默认了很多东西。JPA(Java 持久性 API)是存储业务实体关联的实体的来源,它显示了如何定义一个面向普通 Java 对象(POJO)作为一个实体,以及如何与管理关系实体,提供了一套标准。因此,javax.persistence 下面的有些注解我们还是必须要去了解的,便于更好的提高工作效率。(1)javax.persistence 我们打开源码位于 hibernate-jpa-**.jar 包里面。依赖原创 2022-01-08 12:30:31 · 11542 阅读 · 1 评论 -
Spring Data JPA 从入门到精通~@NamedQueries预定义查询
这种是预定义查询的一种形式(1)在 @Entity 下增加 @NamedQuery 定义。public @interface NamedQuery { //query的名称,规则:实体.方法名; String name(); //具体的JPQL查询语法 String query();}需要注意,这里的 Query 里面的值也是 JPQL,查询参数也要和实体进行对应起来。因为实际场景 中这种破坏 Entity 的侵入式很不美感,也不方便,所以这种方式容易遗忘,工作中不.原创 2022-01-08 12:25:03 · 1389 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~@Procedure 储存过程的查询方法
我们通过 @Procedure 来介绍一下,JPA 对储存过程的支持。(1)@Procedure 源码如下:public @interface Procedure { // 数据库里面储存过程的名称 String value() default ""; // 数据库里面储存过程的名称 String procedureName() default ""; //在EntityManager中的名字,NamedStoredProcedureQuery使用 String原创 2022-01-08 12:23:14 · 1761 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~@Modifying修改查询
学习思路一样,我们先看源码:public @interface Modifying {//如果配置了一级缓存,这个时候用clearAutomatically=true,就会刷新hibernate的一级缓存了, 不然你在同一接口中,更新一个对象,接着查询这个对象,那么你查出来的这个对象还是之前的没有更新之前的状态。这个比较适合老Hibernate的开发的程序员。 boolean clearAutomatically() default false;}可以通过在 @Modifying 注解原创 2022-01-08 12:19:42 · 876 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~SpEL表达式的支持
在 Spring Data JPA 1.4 以后,支持在 @Query 中使用 SpEL 表达式(简介)来接收变量。SpEL 支持的变量 变量名 使用方式 描述 entityName select x from #{#entityName} x 根据指定的Repository自动插入相关的entityName 有两种方式能被解析出来:如果定了 @Entity 注解,直原创 2022-01-08 12:17:08 · 6330 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~@Param用法
默认情况下,参数是通过顺序绑定在查询语句上的,这使得查询方法对参数位置的重构容易出错。为了解决这个问题,可以使用 @ Param 注解指定方法参数的具体名称,通过绑定的参数名字做查询条件,这样不需要关心参数的顺序,推荐这种做法,比较利于代码重构。案例 4.9:根据参数进行查询。public interface UserRepository extends JpaRepository<User, Long> { @Query("select u from User u where u原创 2022-01-07 15:06:48 · 1391 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~@Query详解
语法及其源码public @interface Query { /** * 指定JPQL的查询语句。(nativeQuery=true的时候,是原生的Sql语句) */ String value() default ""; /** * 指定count的JPQL语句,如果不指定将根据query自动生成。 * (如果当nativeQuery=true的时候,指的是原生的Sql语句) */ String countQuery() default原创 2022-01-07 14:59:50 · 3019 阅读 · 0 评论 -
Spring Data JPA 从入门到精通~查询结果的处理
参数选择(Sort/Pageable)分页和排序特定类型的参数,Pageable 并动态 Sort 地将分页和排序应用于查询案例:在查询方法中使用 Pageable、Slice 和 Sort。Page<User> findByLastname(String lastname, Pageable pageable);Slice<User> findByLastname(String lastname, Pageable pageable);List<User&g原创 2022-01-07 14:55:48 · 2172 阅读 · 0 评论 -
解决JPA的枚举局限性
对于数据字典型字段,java的枚举比起Integer好处多多,比如1、限定值,只能赋值枚举的那几个实例,不能像Integer随便输,保存和查询的时候特别有用2、含义明确,使用时不需要去查数据字典3、显示值跟存储值直接映射,不需要手动转换,比如1在页面上显示为启用,0显示禁用,枚举定义好可以直接显示4、基于enum可以添加一些拓展方法我的项目使用spring boot JPA(hibernate实现),支持@Enumerated的annotation来标注字段类型为枚举,如:..转载 2021-12-25 22:18:10 · 1468 阅读 · 0 评论 -
Spring Data JPA 禁止自动更新
公司的项目后台架构是SpringBoot + Spring Date JPA,采用MySQL数据库。在工作刚开始时就遇到了一个奇怪的现象。在采用Date JPA查询完数据库之后,若改变了查询出的对象属性,那么数据库就会自动更新。比如查询出一个studentPO的name为“小明”,然后进行了一步studentPO.setName("小红")操作,再返回给前台,此时的数据库中的这个studentPO的name就会自己变成小红。但是我并没有调用updateBean方法去主动的更新这个对象,为什么它就会自动更新了转载 2021-07-30 17:06:37 · 2802 阅读 · 0 评论 -
Entity 监听器和回调方法
Chapter6.Entity listeners and Callback methods6.1. Definition6.2. Callbacks and listeners inheritance6.3. XML definition6.1.DefinitionIt is often useful for the application to react to certain events that occur inside the persistence mechanism...转载 2021-07-19 20:21:51 · 419 阅读 · 0 评论
分享