JPA的进阶

新鲜速递:Spring Data JPA 3.0快速入门、进阶到精通 随着Spring Boot 3.0的发布,Spring Data JPA 3.0也逐渐走入大家的视野,本文将由浅入深的传授如何快速入门和使用Spring Data JPA。 阅读详情

一JPA的主键的生成策略

主键:
是能够进行区分表里面的每一行的数据的
主键有这非空且唯一的特点
主键的分类:
1.自然主键:
是具有实际意义的列来做为主键的
2.代理主键:
是用的没有实际意义的列来作为主键的–是单体项目
什么是主键的生成策略
jpa采取的方案方式去生成主键
jps:
1. auto策略 ,这种方法是默认使用的:根据数据库的方式来进行选择的是到底使用哪 种策略就比如,配置mysql的方式 策略 mysql的策略是自增策略(所以一般都喜欢用mysql)
配置oracle方式 策略 序列sequeence策略 这个很多都是不会用的主要是这个是收费的!
create sequece s_employee;
​ insert into table(id,name,…) values(s_employee.nextVal())
2.table策略:
这个是表生成的策略,是额外创建一张表来维护主键

SEQUENCE_COUNTSEQUENCE_NAME
2t_employee

3.sequence策略:这是序列策略
4.identity策略:mysql采用的就是这种自增策略

二.JPA的状态

1.什么叫做JPA的状态:
一个实体交给jpa维护的时候,这个实体在不同的时期,状态不一样

(1)临时(瞬时)New:刚刚创建出来。没有和jpa进行发生关系

(2)==持久(托管)==Managed:这个实体对象已经和jpa发生关系

(3)游离(脱管)Detached:脱离entityManager的管理,已经被持久化,不存在的entityManager里面

(4)删除Remove:即将要删除的时候,remove
2.脏数据
1.脏数据:
脏数据(Dirty Read)是指源系统中的数据不在给定的范围内或对于实际业务毫无意义,或是数据格式非法,以及在源系统中存在不规范的编码和含糊的业务逻辑。
2.脏数据的更新*
一个持久化状态数据,修改非主键的值,会在commit提交的时候,自动会发送sql去更新
3.n-to-n问题
一个持久化状态的数据,如果修改主键的之后,就会报错,也就是说,持久化状态的数据,不能改变主键的值
4.实体的类定义规则
1、属性要是私有的。
    在这里插入图片描述
  2、要有公开的setter和getter方法供外界访问和修改。
    
在这里插入图片描述

3、每一个实体类要有一个属性作为唯一值(一般都是使用对于数据表的主键)。
    
在这里插入图片描述

4、建议数据类型不要使用基本的数据类型,而是使用相应的包装类。
    在这里插入图片描述

5、Java中对应的包装类

基本数据类型对应包装类
intInteger
charCharacter
booleanBoolean
floatFloat
doubleDouble
shortShort
longLong
byteByte

使用包装类的原因:因为有时候使用基本数据类型无法准确表示一些场景。

例:score代表学生的成绩,但是在考试时可能存在缺考的情况,如果使用int数据类型,则score = 0表示考了分,但是缺考还是score =0,这样无法区分;如果使用Integer,则要是缺考,score = null;这样就可以区分是考了0分还是缺考。

三域对象之间的关系

1.域对象之间的关系
对象和对象之间,存在一定关系存在什么关系?
主要是关联关系的细化需要注意强弱,由若到强分别是 依赖 < 关联 < 聚合 < 组合
泛化(generalization),关联(association),依赖(dependency),实现(realization)

泛化(generalization)关系时指一个类(子类、子接口)继承另外一个类(称为父类、父接口)的功能,并可以增加它自己新功能的能力,继承是类与类或者接口与接口最常见的关系,在Java中通过关键字extends来表示。
在这里插入图片描述

实现(realization)是指一个class实现interface接口(一个或者多个),表示类具备了某种能力,实现是类与接口中最常见的关系,在Java中通过implements关键字来表示。

在这里插入图片描述

依赖(dependency)关系也是表示类与类之间的连接,表示一个类依赖于另外一个类的定义,依赖关系时是单向的。简单理解就是类A使用到了类B,这种依赖具有偶然性、临时性,是非常弱的关系。但是类B的变化会影响到类A。举个例子,如某人要过河,则人与船的关系就是依赖,人过河之后,与船的关系就解除了,因此是一种弱的连接。在代码层面,为类B作为参数被类A在某个方法中使用。

在java中,依赖表现为:局部变量,方法中的参数和对静态方法的调用。

在这里插入图片描述

关联(association)关系表示类与类之间的连接,它使得一个类知道另外一个类的属性和方法。

关联可以使用单箭头表示单向关联,使用双箭头或者不适用箭头表示双向关联,不建议使用双向关联,关联有两个端点,每个端点可以有一个基数,表示这个关联的类可以有几个实例。

0…1 表示可以有0个或者1个实例

0…* 表示对实例的数目没有限制

1 表示只能有一个实例

1…* 表示至少有一个实例

关联关系体现的是两个类,或者类与接口之间的强依赖关系,这种关系很强烈,比依赖更强,不是偶然性的,也不是临时性的,而是一种长期性,相对平等的关系,表现在代码层面,为被关联的类B以类属性的形式出现在类A中,也可能是关联类A引用了被关联类B的全局变量。

在Java中,关联关系是使用实例变量来实现的

在这里插入图片描述

聚合(aggregation)是关联关系的特例,是强的关联关系,聚合是整个与个体的关系,即has-a关系,此时整体和部分是可以分离的,他们具有各自的生命周期,部分可以属于多个对象,也可以被多个对象共享;比如计算机和CPU,公司与员工的关系;在代码层面聚合与关联是一致的,只能从语义上来区分。

聚合关系也是使用实例变量来实现的,在java语法上区分不出关联和聚合,关联关系中类出于一个层次,而聚合则明显的在两个不同的层次。
在这里插入图片描述

组合(compostion)也是关联关系的一种特例,体现的是一种contain-a关系,比聚合更强,是一种强聚合关系。它同样体现整体与部分的关系,但此时整体与部分是不可分的,整体生命周期的结束也意味着部分生命周期的结束,反之亦然。如大脑和人类。

体现在代码层面与关联时一致的,只能从语义来区分。

组合与聚合几乎完全相同,唯一区别就是对于组合,“部分”不同脱离“整体”单独存在,其生命周期应该是一致的。

在这里插入图片描述
2.单向多对一
1.基本配置
Product

@Entity
@Table(name="t_product")
public class Product {
    //主键
    @Id
    @GeneratedValue
    private Long id;
    private String name;

    @ManyToOne//多对一
    @JoinColumn(name = "dir_id")//指定外键名称
    private ProductDir dir ;
     set/get方法
    }

ProductDir

@Entity
@Table(name="t_productDir")
public class ProductDir {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
   	get/set方法
   }

2.保存

先保存一方 在保存多方—少发送sql

 		entityManager.persist(dir);
 		entityManager.persist(p1);
        entityManager.persist(p2);

3.JPA的抓取策略
抓取策略:

​ JPA告诉程序使用哪种方式去获取数据

抓取策略配置:

​ @ManyToOne(fetch = FetchType.LAZY ) 表示懒加载 – 需要使用的时候,才发送sql查询

​ 类不要定义成final

@ManyToOne(fetch = FetchType.EAGER) 表示迫切加载 – 不使用都把数据加载出来 发送左外连接查询数据
4.二级缓存
缓存作用:牺牲内存空间去换取时间

一级缓存:属于EntityManager级别的缓存 ,它是自带的

​ 命中条件:

​ 同一个EntityManagerFactory 同一个EntityManager 同一个OID

二级缓存:属于EntityManagerFactory级别缓存,它不是自带,如果要使用二级缓存,相应配置之后,才能使用二级缓存 — 通过Encache 框架来实现二级缓存

5.查询缓存
查询缓存方面主要涉及两个参数,query_cache_size用于设置MySQL的查询缓存(query cache)大小,query_cache_type用于设置使用查询缓存的类型,
可以用以下命令查看具体使用情况:

mysql> show global status like 'qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 195024544 |
| Qcache_hits             | 0         |
| Qcache_inserts          | 3         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 121       |
| Qcache_queries_in_cache | 1         |
| Qcache_total_blocks     | 4         |
+-------------------------+-----------+

8 rows in set (0.00 sec)

相关参数解释如下:
Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。flush query cache会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory:缓存中的空闲内存。
Qcache_hits:多少次命中,通过这个参数可以查看query cache的基本命中效果。
Qcache_inserts:每次插入一个查询时就增大,命中次数除以插入次数就是非命中率。
Qcache_lowmem_prunes:多少条query因为内存不足而被清理出query cache,通过Qcache_lowmem_prunes和Qcache_free_memory参数相互结合,能够
更清楚地了解到系统中query cache的内存大小是否真的足够,是否非常频繁的出现因为内存不足而有query被换出的情况。
Qcache_not_cached:不适合进行缓存的查询数量,通常是由于这些查询不是SELECT语句或用了now()之类的函数。
Qcache_queries_in_cache:当前缓存的查询和响应数量。
Qcache_total_blocks:缓存中块的数量。

关于query_cache的配置:
mysql> show variables like 'query_cache%';
+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| query_cache_limit            | 1048576   |
| query_cache_min_res_unit     | 4096      |
| query_cache_size             | 195035136 |
| query_cache_type             | ON        |
| query_cache_wlock_invalidate | OFF       |
+------------------------------+-----------+
5 rows in set (0.00 sec)

各个字段的解释如下:
query_cache_limit:超过此大小的查询将不再缓存。
query_cache_min_res_unit:缓存块的最小值。
query_cache_size:缓存大小值
query_cache_type:缓存类型,决定缓存什么样的查询。
query_cache_wlock_invalidate:表示当有其它客户端正在对MyISAM表进行写操作时,读请求是要等write lock释放资源后再查询还是允许直接
从query cache中读取结果,默认为FALSE
查询缓存碎片率=Qcache_free_blocks/Qcache_total_blocks * 100%
查询缓存利用率=(query_cache_size - Qcache_free_memory)/query_cache_size * 100%
查询缓存利用率在25%以下,说明query_cache_size设置的过大,可适当减小。
查询缓存命中率=(Qcache_hits - Qcache_inserts) / Qcache_hits * 100%

四.缓存的理论

缓存是当今各种软件或者硬件系统中不可缺少的技术之一,所以对每个程序员来说都显得异常重要,对ahuaxuan来说亦是如此。

1缓存为什么要存在?
2缓存可以存在于什么地方?
3缓存有哪些属性?
4缓存介质?

搞清楚这4个问题,那么我们就可以随意的通过应用的场景来判断使用何种缓存了.

下面ahuaxuan和大家一一分析这4个问题.

  1. 缓存为什么要存在?
    一般情况下,一个网站,或者一个应用,它的一般形式是,浏览器请求应用服务器,应用服务器做一堆计算后再请求数据库,数据库收到请求后再作一堆计算后把数据返回给应用服务器,应用服务器再作一堆计算后把数据返回给浏览器.这个是一个标准流程.但是随着互连网的普及,上网的人越来越多,网上的信息量也越来越多,在这两个越来越多的情况下,我们的应用需要支撑的并发量就越来越多.然后我们的应用服务器和数据库服务器所做的计算也越来越多,但是往往我们的应用服务器资源是有限的,数据库每秒中接受请求的次数也是有限的(谁叫俺们的硬盘转速有限呢).如果利用有限的资源来提供尽可能大的吞吐量呢,一个办法:减少计算量,缩短请求流程(减少网络io或者硬盘io),这时候缓存就可以大展手脚了.缓存的基本原理就是打破上图中所描绘的标准流程,在这个标准流程中,任何一个环节都可以被切断.请求可以从缓存里取到数据直接返回.这样不但节省了时间,提高了响应速度,而且也节省了硬件资源.可以让我们有限的硬件资源来服务更多的用户.

2 缓存可以存在于什么地方?

Java代码 复制代码 收藏代码
浏览器—浏览器和app之间—分过层的app-数据库
Java代码 收藏代码
浏览器—浏览器和app之间—分过层的app-数据库

在上图中,我们可以看到一次请求的一般流程,下面我们重新绘制这张图,让我们的结构稍微复杂一点点.
(将app分层)
浏览器—浏览器和app之间—分过层的app-数据库

理论上来将,请求的任何一个环节都是缓存可以作用的地方.第一个环节,浏览器,如果数据存在浏览器上,那么对用户来说速度是最快的,因为这个时候根本无需网络请求.第二个环节,浏览器和app之间,如果缓存加在这个地方,那么缓存对app来说是透明的.而且这个缓存中存放的是完整的页面.第三个节点,app中本身就有几个层次,那么缓存也可以放在不同的层次上,这一部分是情况或者场景比较复杂的部分.选择缓存时需要谨慎.第四个环节,数据库中也可以有缓存,比如说mysql的querycache.

那么也就是说在整个请求流程的任何一点,我们都可以加缓存.但是是所有的数据都可以放进缓存的吗.当然不是,需要放进缓存的数据总是有一些特征的,要清楚的判断数据是否可以被缓存,可以被怎样缓存就必须要从数据的变化特征下手.

数据有哪些变化特征?最简单的就是两种,变和不变.我们都知道,不会变化的数据不需要每次都进行计算.问题是难道所有的数据理论上来讲都会变化,变化是世界永恒的主题.也就是说我们把数据分为变和不变两种是不对的,那么就让我们再加一个条件:时间.那么我们就可以把数据特征总结为一段时间内变或者不变.那么根据这个数据特征,我们就可以在合适的位置和合适的缓存类型中缓存该数据.

3缓存有哪些属性
从面向对象的角度来看,缓存就是一个对象,那么是对象,必然有属性.那么下面我们来探讨一下缓存有哪些属性.以下列举我们常用到的3个属性.
(1) 命中率
命中率是指请求缓存次数和缓存返回正确结果次数的比例.比例越高,就证明缓存的使用率越高.

命中率问题是缓存中的一个非常重要的问题,我们都希望自己缓存的命中率能达到100%,但是往往事与愿违,而且缓存命中率是衡量缓存有效性的重要指标.

(2) 最大元素
缓存中可以存放得最大元素得数量,一旦缓存中元素数量超过这个值,那么将会起用缓存清空策略,根据不同的场景合理的设置最大元素值往往可以一定程度上提高缓存的命中率.从而更有效的时候缓存.

(3) 清空策略

1 FIFO ,first in first out ,最先进入缓存得数据在缓存空间不够情况下(超出最大元素限制时)会被首先清理出去
2 LFU , Less Frequently Used ,一直以来最少被使用的元素会被被清理掉。这就要求缓存的元素有一个hit 属性,在缓存空间不够得情况下,hit 值最小的将会被清出缓存。
2 LRU ,Least Recently Used ,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。

4缓存介质
从硬件介质上来将无非就是两种,内存和硬盘(对应应用层的程序来讲不用考虑寄存器等问题).但是往往我们不会从硬件上来划分,一般的划分方法是从技术上划分,可以分成几种,内存,硬盘文件.数据库.
(1) 内存.将缓存放在内存中是最快的选择,任何程序直接操作内存都比操作硬盘要快的多,但是如果你的数据要考虑到break down的问题,因为放在内存中的数据我们称之为没有持久话的数据,如果硬盘上没有备份,机器down机之后,很难或者无法恢复.

(2) 硬盘.一般来说,很多缓存框架会结合使用内存和硬盘,比如给内存分配的空间有满了之后,会让用户选择把需要退出内存空间的数据持久化到硬盘.当然也选择直接把数据放一份到硬盘(内存中一份,硬盘中一份,down机也不怕).也有其他的缓存是直接把数据放到硬盘上.

(3) 数据库.说到数据库,可能有的人会想,之前不是讲到要减少数据库查询的次数,减少数据库计算的压力吗,现在怎么又用数据库作为缓存的介质了呢.这是因为数据库又很多种类型,比如berkleydb,这种db不支持sql语句,没有sql引擎,只是key和value的存储结构,所以速度非常的快,在当代一般的pc上,每秒中十几w次查询都是没有问题的(当然这个是根据业务特征来决定的,如果您访问的数据在分布上是均匀的,那ahuaxuan可不能保证这个速度了).

除了缓存介质之外,ahuaxuan根据缓存和应用的耦合程度将其划分为local cache和remote cache.
Local cache是指包含在应用之中的缓存组件.而remote cache指和应用解耦在应用之外的缓存组件.典型的local cache有ehcache,oscache,而remote cache有大名鼎鼎的memcached.

Localcache最大的优点是应用和cache的时候是在同一个进程内部,请求缓存非常快速,完全不需要网络开销等.所以单应用,不需要集群或者集群情况下cache node不需要相互通知的情况下使用local cache比较合适.这也是java中ehcache和oscache这么流行的原因.
但是Local cache是有一定的缺点的,一般这种缓存框架(比如java中的ehcache或者oscache)都是local cache.也就是跟着应用程序走的,多个应用程序无法直接共享缓存,应用集群的情况下这个问题更加明显,当然也有的缓存组件提供了集群节点相互通知缓存更新的功能,但是由于这个是广播,或者是环路更新,在缓存更新频繁的情况下会导致网络io开销非常大,严重的时候会影响应用的正常运行.而且如果缓存中数据量较大得情况下使用localcache意味着每个应用都有一份这么大得缓存,着绝对是对内存的浪费.

所以这个情况下,往往我们会选择remote cache,比如memcached.这样集群或者分布式的情况下各个应用都可以共享memcached中的数据,这些应用都通过socket和基于tcp/ip协议上层的memcached协议直接连接到memcached,有一个app更新了memcached中的值,所有的应用都能拿到最新的值.虽然这个时候多了很多了网络上的开销,但是往往这种方案要比localcache广播或环路更新cache节点要普遍的多,而且性能也比后者高.由于数据只需要保存一份,所以也提高了内存的使用率.

通过以上分析可以看出,不管是local cache,还是remote cache在缓存领域都有自己的一席之地,所以ahuaxuan建议在选择或者使用缓存时一定要根据缓存的特征和我们的业务场景准确判断使用何种缓存.这样才能充分发挥缓存的功能.

Ahuaxuan认为,缓存的使用是架构师的必备技能,好的架构师能够根据数据的类型,业务的场景来准确的判断出使用何种类型的缓存,并且如何使用这种类型的缓存.在缓存的世界里也没有银弹,目前还没有一种缓存可以解决任何的业务场景或者数据类型,如果这种技术出现了,那架构师就又更不值钱了.呵呵.

JPA大全之经典全集 此资源集成了相关的JPA资源,包括JPA官方文档 JPA详解 JPA批注参考 JPA应用…… 立即下载

相关推荐

S-function入门及案例详解(1)——S-function基础介绍及基本案例

本专题将用三篇文章对S-function进行介绍及其案例详解。欢迎关注~ 目录一、S-Function简介二、详解sfuntmpl函数2.1 sfuntmpl函数介绍2.2 mdlInitializeSizes函数2.3 mdlDerivatives函数2.4 mdlUpdate函数2.5 mdlOutputs函数2.6 mdlGetTimeOfNextVarHit函数2.7 mdlTerminate函数三、案例1——对波形的幅值进行放大3.1 案例分析3.2 案例详解3.3 输出波形四、案例2——对波形的

Wendy的博客 7万+

Spring Data JPA 原理与实战第七天 JpaRepoitory进阶、Auditing使用

11 JpaRepoitory 如何自定义? 通过前面课时的内容,相信你已经掌握了很多 Repository 的高级用法,但是在实际工作场景中也难免会出现自定义 Repsitory 实现类的场景,这一课时我们就来看一下如何定义自己的 Repository 实现类。要知道 JPA 的操作核心是 EntityManager,那么我们先看看 Entitymanager 究竟为何物。 EntityManager 介绍 Java Persistence API 规定,操作数据库实体必须要通过 EntityManag

fegus的博客 1658

DIY压电陶瓷传感器信号放大:从拆解到JFET电路实战(附示波器实测数据)

本文详细介绍了如何利用废旧设备拆解的压电陶瓷片,结合JFET(结型场效应管)高输入阻抗特性,DIY搭建高灵敏度振动传感器放大电路。从元件拆解、参数实测到JFET共源极放大器实战搭建与调试,提供了完整的步骤、示波器实测数据及优化方案,帮助电子爱好者实现低功耗振动检测应用。

weixin_29195615的博客 389

论缓存之第一<道>

/** * 作者:ahuaxuan * 日期:2009-03-08 */ [size=medium]看一粒沙中的世界, 一朵野花中的天堂。 把无限握于掌中, 把永恒握于瞬间。——威廉• 布莱克 开始讨论缓存之前,让我们先来讨论讨论另外一个问题:理论和实践.从ahuaxuan接触的程序员来看,有的程序员偏实践,有的程序员偏理论,但是这都是不好的行为,理论和实践同样重要,我们在...

求贤若渴, 礼贤下士 209

Mem0 vs LangMem vs Letta:三大AI记忆框架实战对比(附代码示例)

本文深入对比了Mem0、LangMem和Letta三大AI记忆框架的核心特性与适用场景。Mem0提供开箱即用的记忆管理服务,适合快速集成;LangMem深度融入LangGraph生态,适合复杂工作流;Letta则采用虚拟内存系统,旨在突破上下文窗口限制。文章通过实战代码示例,为开发者选择适合其业务需求的AI记忆解决方案提供了清晰指南。

g9h0i1的博客 679

华为OD机试真题 新系统【查找能被整除的最大整数】

华为OD新系统机试真题【查找能被整除的最大整数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【查找能被整除的最大整数】

qq_45776114的博客 672

JPA进阶

1.主键生成 策略【非空且 唯一】 (1) 自然主键:有业务含义的主键 代理主键:这个主键没有意义,用来区别每行的数据是不同的,最常用 (2) auto策略、table策略、sequence策略、identity策略 默认使用这种:根据数据库方言来选择的到底使用哪种策略 ​ 比如 配置mysql的方言 --策略 自增策略 (都喜欢mysql) ​配置oracle的方言 -- 策略 序列se...

primarykey123的博客 296

dify制作的工作流如何通过API调用

本文介绍了如何通过Python程序调用Dify工作流API实现数据处理功能。文章详细展示了workflow和chatflow的调用方法,包括参数设置和结果输出,并提供了一个完整的API调用工具代码示例。该工具可实现文本处理、成果查重、关键词生成等功能,支持通过Python脚本或Postman进行调用。核心代码包含API请求函数和批量处理函数,通过HTTP请求与Dify服务端交互,实现自动化数据处理流程。

hhue2007的专栏 935

springboot中jpa使用mongodb模糊查询

最近在项目中使用了mogodb,第一次用,先在菜鸟教程上熟悉了基本的crud操作了,这些可以用 mongoTemplate这个模板给的对应方法如下: // @Test // public void insert() { // try { //parm1 插入的实体类对象 parm2 集合名字 // mongoService.insertOne(new User("dxy","123...

焱童鞋 3311

NSIS教程(6): 使用第三方插件

NSIS内置了很多指令,这些指令可以满足我们基本需求,但难免会遇到NSIS没有内置的功能,如进程操作,后台运行(即多线程),7z压缩等等,这个时候我们就需要借助第三方插件来满足我们所需要的功能了。 一、插件获取 NSIS官方收录插件的网址是:http://nsis.sourceforge.net/Category:Plugins,我们可以在这个网站上查找和下载我们需要的插件,该网站上针对每

while(1) { smile(); } 9万+

VisionTransformer改进(11):结合CoordAtt注意力机制

​​CoordAtt模块​​:一个轻量级的坐标注意力机制​​ViT模型​​:基于标准Vision Transformer架构,但集成了CoordAtt模块模型最终通过CNNModel函数封装,虽然名称是CNN,但实际上是一个Transformer模型。引入了轻量级的CoordAtt注意力机制,增强了模型对空间位置信息的捕捉能力保持了ViT的主要优势,同时通过注意力机制提升了特征表示能力设计简洁高效,适合作为基础模型进行进一步研究和应用。

2401_82355416的博客 701

Spring Data JPA排序实战:从基础到进阶

在Spring Data JPA中,排序是一个常见的需求。本文将通过一个具体的实例,详细介绍如何在Spring Data JPA中使用Sort参数进行排序,从基础的使用方法到一些进阶的技巧,带你一步步掌握。可以看到,通过Sort.by(“salary”, “name”).ascending(),我们成功地按照salary和name字段进行了升序排序。在客户端中,我们创建一些员工数据并保存到数据库中,然后使用Sort参数进行排序查询。最后,我们定义一个主类来运行客户端。

m0_74337424的博客 486

华为MetaERP国资委语境下的 DRP(全域数字化资源管理平台/Digitalized Resource-management Platform)与传统 ERP(以 SAP、Oracle 为代表)的

【摘要】国资委推动的DRP(全域数字化资源管理平台)正在重构央国企数智化转型路径,其本质是通过"ERP管交易+DRP管管控"的双层架构实现升维替代。与传统ERP相比,DRP具有三大突破:采用国产分布式数据库实现全级次穿透监管、构建数据中台打破信息孤岛、以实时分析替代事后报表。当前政策明确2026-2030年分阶段建设目标,这将重塑产业格局——倒逼传统ERP厂商转型,为云原生/AI/信创企业创造新机遇。需注意DRP并非简单替代ERP,而是通过治理模式变革实现"交易系统做薄、管控中

金牌架构师 286

Spring Data JPA进阶(一):自定义实现

此系列为Spring Data JPA进阶篇,主要介绍一些不常用但强大的Spring Data JPA使用技巧。 在给别人介绍Spring Data JPA的时候,往往会得到这样一个回复:Spring Data JPA使用起来是很方便,但是不够灵活。比如Mybatis,基于SQL,就可以很灵活。 其实Spring Data JPA也可以很灵活,甚至比Mybatis更灵活。比如我们要使用Spring...

程铭程铭你快成名的博客 5405

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JPA Specification 进阶:优雅地实现跨实体 JOIN 动态查询 ✨

今天,我将通过一个真实的业务场景——“根据关联的 Product 实体的 region (地区) 字段来筛选 SolutionProduct”——来为你完整地演示如何在 Specification 中优雅地实现跨实体的 JOIN 动态查询。

小丁的博客 1815

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

JPA 02 进阶

JPA 02 进阶 主键生成策略(掌握); ​ 主键:能够区分表里面每一行数据 ​ 主键特点:非空且唯一 ​ 主键的分类: ​ 自然主键:具有实际意义的列来作为主键 ​ 代理主键:没有实际意义的列来作为主键 — 单个项目使用 JPA直接不定义 @GeneratedValue 就可以了,在保存之前设置主键的值 如果定义看 @GeneratedValue ,再去设置主键的值就会报错 不能修...

Kira_7的博客 440

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JPA进阶二级缓存

              JPA进阶二级缓存 1.主键的分类    1.自然主键:没有实际意义的主键     2.代理主键     主键的特征:非空且唯一的     @GeneratedValue 默认为auto     主键的生成策略:jap标准的策略有四种 auto table sequence identity              ...

weixin_30332241的博客 133

mysql jpa缓存_JPA进阶二级缓存

JPA进阶二级缓存1.主键的分类1.自然主键:没有实际意义的主键2.代理主键主键的特征:非空且唯一的@GeneratedValue 默认为auto主键的生成策略:jap标准的策略有四种 auto table sequence identityauto:自动选择一个最适合底层数据库的主键生成策略支持MySQL此种主键生成策略比较常用table:表的生成策略 额外创建一张表来维护主键s...

weixin_34096605的博客 312

JPA EntitManager进阶

上篇咱们简单介绍了JPA EntityManager的基本操作, 咱们今天接着,更深一层次的介绍EntityManager。 1 级联操作 2 实体状态 3 数据同步 1 级联操作   1.1 持久化带关系和实体  上次,我们只是持久了一个客户实体, 如果创建客户的时

kiven 1831

SpringData Jpa(3)SpringDataJpa进阶,CURD

一、JPA提供的接口 Repository: 最顶层的接口,是一个空接口,目的是为了统一所有的Repository的类型,且能让组件扫描时自动识别 CrudRepository: Repository的子接口,提供CRUD 的功能。 PagingAndSortingRepository:CrudRepository的子接口, 添加分页排序。 JpaRepository: PagingAndSortingRepository的子接口,增加批量操作等。 JpaSpecificationExecutor: 用

清茶与浊酒 605

JPA进阶-持久化状态

我的博客:欢迎大家访问 JPA进阶 主键生成策略 主键:数据的唯一标识,必须是非空唯一的 JPA主键生成的标准策略有4种: auto:默认,根据方言自动选择生成策略 identity:mysql的主键自增长策略 sequence:主键的创建效率最高,Oracle的序列对象 table:其他的数据库使用,创建一个表,专门用来存储主键 一般使用默认的生成策略就行了 JPA持久对象的状态 临时状态 ...

f2315895270的博客 805

SpringBoot开发案例之整合Spring-data-jpa进阶篇

原文链接 摘要: 前言 有人说 从 jdbc-&gt;jdbctemplate-&gt;hibernation/mybatis 再到 jpa,真当开发人员的学习时间不要钱?我觉得到 h/m 这一级的封装已经有点过了,再往深处走就有病了。 前言 有人说 从 jdbc-&gt;jdbctemplate-&gt;hibernation/mybatis 再到 jpa,真当开发人员的学习时间不要钱...

weixin_40581980的博客 420

Java Web开发进阶——Spring Boot与Spring Data JPA

Spring Data JPA 是 Spring Data 项目中的子项目,旨在简化与 JPA(Java Persistence API)的集成。它在标准 JPA 的基础上提供了更高层次的抽象,开发者可以使用极少的代码实现复杂的数据操作。Spring Data JPA 是 Spring 提供的一种面向数据访问的持久化框架,它简化了 JPA 的实现,为开发者提供了一种快速操作数据库的方式。Spring Data JPA 的强大之处在于其灵活的查询方式,支持方法派生、JPQL 和原生 SQL。

好看资源网的博客 2244

JPA学习笔记-JPA进阶

1.JPA的实体生命周期:JPA的实体有以下4中生命周期状态:(1).New:瞬时对象,尚未有id,还未和Persistence Context建立关联的对象。(2).Managed:持久化受管对象,有id值,已经和Persistence Context建立了关联的对象。(3).Datached:游离态离线对象,有id值,但没有和Persistence Context建立关联的对象。(4).Remo

白衣 1197
上一篇: jQuery easyui(上)
薚&阳
博客等级 码龄7年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值