Spring JPA 实体类 save 方法都执行了那些语句?

使用 JPA 的 `save()` 方法更新数据库中的数据 在 JPA 中,save()方法通常由或接口提供,用于保存或更新一个实体。保存新数据:如果实体没有主键(ID)或 ID 为null,JPA 会将其识别为新实体,执行插入操作。更新现有数据:如果实体的主键已存在,JPA 会执行更新操作,修改数据库中已有的记录。JPA 的save()方法配合事务管理,能够在同一个事务中将操作数据保存到数据库。但是,在实际操作中,可能会遇到save()方法执行后,数据库并没有立即更新的情况。以下是导致此问题的常见原因及其解决方法。使用 JPA 进行数据持久化时,save() 阅读详情

insert 或 update 都是通过调用 JpaRepository 的 save 方法实现的。

本文以 User,Role,Group (用户,角色,组)为例进行阐述。

用户和角色是多对多关系,用户和组是多对一关系。

单个实体类的 save

对于实体类 User ,调用 save(user) 方法,分为以下情况讨论:

  • 假如 user 的主键字段(@Id 修饰的字段)为空,是新增方法,执行一条 insert 语句。

  • 假如主键字段不为空则会先执行 select 语句,查看当前主键对应的 user 是否存在。
    - 假如不存在则执行 insert 语句,需要注意的是如果主键有自动生成规则,保存的主键则会根据数据库的规则生成而不是设置的值。
    - 假如存在则比较字段值有无变化,有变化则执行 update 语句。

总结如下:

  • 执行 insert 语句的条件:待保存的实体类主键为空,或者主键是一个在数据库中不存在的值。
  • 执行 update 语句的条件:待保存的实体类主键不为空,并且主键是一个在数据库中存在的值,并且相比数据库存在的值有变化。

ManyToOne 关系中的 save

对于实体类 User 和 Group,User 与 Group 的关系是多对一关系,Group 与 User 的关系是一对多关系。
多对一关系中,一般不会新建关系表,User 实体类中有一个字段是 Group 类型

@ManyToOne
@JoinColumn(name = "group_id")
private Group group;

相应的 User 表中有一个 group_id 字段关联 Group 表。

对于实体类 User ,调用 save(user) 方法,假如 user 内部的 group 不为空并且 group 没有设置主键字段,则会报错。假如 user 内部的 group 不为空并且 group 设置了主键并且主键在表中不存在,则会报错。报错都是因为数据库硬性指定了外键。

只有 group 为空,或者 group 不为空并且主键字段对应的数据在 Group 表中存在的时候才不会报错。

ManyToMany 关系中的 save

假设 User 和 Role 两个实体是多对多关系。通过 @ManyToMany 注释,JPA 会自动生成并维护 user 和 role 的关系表。

user 里面有个集合是 roles,标注了多对多关系。

@ManyToMany
@JoinTable(name = "user_role",
            joinColumns = {@JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id")})
private List<Role> roles;

调用 save(user) 方法时,roles 字段的要求如下:

  • roles 集合可以为空,若为空调用 save(user) 方法:假如 user 执行的是 update 语句,则会删除所有当前 user 主键字段的关系。假如 user 执行的是 insert 语句,则对关系表没有操作。

  • roles 若不为空调用 save(user) 方法:假如 user 执行的是 update 语句,则会删除所有当前 user 主键字段的关系,然后重新插入(例外情况就是从数据库中查询出 user 后,对此 user 的 roles 元素没有增删或者更改主键字段,更改元素的其它字段没关系,此时对关系表不会有任何操作)。假如 user 执行的是 insert 语句,则对关系表直接插入。无论 insert 还是 update,集合中所有元素的主键字段不能为空或者不存在的值,否则会报错。

需要注意的是,上面对 role 的主键必须存在的情形,只有在 @ManyToMany 的 cascade 字段没有开启级联关联的时候才符合,假如开启插入关联,则会自动在 role 表中插入数据,需另外讨论。

JPA+Scheduled+Transactional 保存数据save或者update没有相关SQL打印 JPA+Scheduled 进行定时任务处理,不报错,不打印insert或者update SQL日志 阅读详情

相关推荐

Spring Boot JPA 常见的那些坑

前言 之前讲解了Spring Boot如何集成JPA和相关特性,虽然JPA使用非常的简单,但是我们在实际的 项目中需要去掌握JPA原理,这样才能更好的解决相关问题。 JPA为什么没有update方法 JPA提供了一个save方法,当主键为空的时候,则执行的为insert语句,当主键不为空的时候,则执行为update方法。 JPA使用Save方法的坑 问题1:需要区分Save方法什么时候执行的insert,什么时候执行的为update语句,切莫误把insert当作了update。 先看下JPA s

uuqaz的博客 1526

如何正确使用spring JPA的save操作详解-新增与修改(一)

结论:spring JPA的save操作既可以用来新增,也可以用来修改数据 用法:如果要进行数据修改,先使用对应的JpaDAO的默认根据ID查询方法-findById(Id)查询得到Optional(XXXDO),再对XXXDO进行属性赋值修改,然后进行save,才能实现该Id对应记录的修改,否则会进行更新 原理:第一次添加数据后,在数据session管理器内并没有释放掉生成的数据记录id,后续操作使用了这个id,导致程序认为你会进行修改操作,从而有添加数据变为修改数据 ...

JOKER_ts的博客 7896

电影票购票小程序搭建(源码部署)

答:为用户提供便捷的购票方式,包括授权登录、个性化推荐、在线选座、订单管理等功能,同时在界面设计上注重用户友好性,简化用户的购票流程。答:通过展示电影院的优惠活动和票价信息,同时提供电影推荐功能,根据用户的历史购票记录和电影评分推荐个性化的电影列表,吸引用户购票。编写页面逻辑代码:使用JavaScript编写小程序页面的逻辑代码,实现电影列表的获取、电影详情的展示、座位选择的逻辑等。设计小程序界面:使用WXML和WXSS编写小程序的界面代码,实现电影列表的展示、电影详情的样式、座位选择页面的布局等。

2301_79072569的博客 2068

spring-data-jpa中save不触发数据库insert语句的问题

最近学习spring mvc,用到jpa简化DAO层代码,发现save死活不触发SQL语句,找了好久才解决这个问题,实在是坑。、 <!-- 关键是这个bean,一定要设置正确才行 --> <bean id="transactionManager"> 二话不说了,直接贴配置文件: <beans xmlns="http://www.springf...

weixin_30426879的博客 3068

告别卡顿!用LVGL+DMA刷新STM32F407的SPI屏幕,性能提升实战

本文详细介绍了如何通过LVGL+DMA技术优化STM32F407驱动SPI屏幕的性能,实现接近60FPS的流畅刷新。从硬件瓶颈分析到SPI与DMA的精细化配置,再到LVGL的双缓冲机制与局部刷新优化,提供了一套完整的性能提升方案。特别适合嵌入式GUI开发中面临卡顿问题的工程师参考。

weixin_42531588的博客 378

MT4/MT5数据源接入全攻略:从买服务、自研API到低成本DDE,哪种方案适合你?

本文全面解析MT4/MT5数据源接入的三种主流方案:商业服务、自研API和低成本DDE,详细对比其技术参数、成本结构和适用场景。帮助技术团队根据业务需求选择最优方案,确保外汇交易系统的数据流稳定性和实时性,提升交易体验和业务连续性。

weixin_42568801的博客 172

JPA 执行save()方法成功但是没有插入数据库问题解决

问题描述: 执行save()方法成功但是没有插入数据库 问题分析: 1、需要加上@Transactional(rollbackFor = Exception.class)注解,才能插入成功。

旭东怪的博客 1万+

行为预测模型:Social LSTM与Graph Neural Networks

行为预测模型:Social LSTM与Graph Neural Networks ,人工智能,计算机视觉,大模型,AI,本文围绕行为预测模型Social LSTM与Graph Neural Networks展开,介绍了两者的基础概念、原理、应用场景,还对比了它们在优势、劣势和适用场景上的不同,最后给出了相应的代码示例。Social LSTM基于LSTM,通过社交池化层处理多智能体交互;图神经网络处理图结构数据,靠消息传递获取信息,二者各有侧重,适用于不同场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

Spring-Data-Jpa 保存时save和saveAndFlush的区别详解

Spring-Data-Jpa 保存时save和saveAndFlush的区别 Jpa是我们经常用到的ORM框架,使用它可以快速便捷的操作数据库,那么它有一个保存方法,你肯定不会陌生,就是save方法和saveAndFlush,这两个方法可能会经常用到,那么什么时候使用save方法,什么时候使用saveAndFlush呢,下面就进行简单总结一下。 Jpa save 首先创建一个表,进行完整的代码演示。 -- auto-generated definition create table t_user (

chusen的博客 2万+

45、概率与模糊性:粗糙事件与模糊事件概率的探索

本文探讨了概率理论与模糊性理论在处理现实世界不确定性中的应用,重点分析了模糊事件和粗糙事件的概率定义、性质及其条件概率。同时,介绍了近似贝叶斯网络分类器在信息系统中的应用,以及如何通过概率决策约简提高分类效率。这些方法为处理不确定信息提供了灵活的工具,并在决策和数据分析中具有重要价值。

ik67890123的博客 133

【Inpho精品教程】Inpho简介、安装教程(附Inpho8安装包下载)

本文介绍Trimble旗下Inpho UASMaster航空摄影测量软件,涵盖其核心功能模块(如Match-AT、OrthoMaster、Summit Evolution等)及安装教程。文章详细说明了从安装到汉化破解的全过程,并提供Inpho 8.0.1安装包下载链接与提取码,适用于无人机摄影测量专业用户。

智慧空间实验室 1万+

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。

好看资源网的博客 2243

脑肿瘤MRI图像分割实战:基于U-Net的深度学习完整指南

脑肿瘤是中枢神经系统最常见的疾病之一,全球每年有超过30万人被诊断为原发性脑肿瘤。在临床诊断和治疗过程中,磁共振成像(MRI)已成为评估脑肿瘤的标准影像学检查方法。然而,手动分割MRI图像中的肿瘤区域是一项耗时且依赖于专家经验的工作,不同医生之间可能存在显著差异。

YOLO 150

spring data jpa save 返回 主键问题

调试时发现,如果调用 Repository 的 save 方法时,对应的主键,还是为空。以为是什么bug。 后面查阅资料发现。其实是在返回值中,而不是传入值中。 查看SimpleJpaRepository源码,调试发现,如果是走persist(新增,判断是否新,是看是不是null,如果主键是空字符串,也是走的merge)。 传入的对象里面的主键会有值。 如果是走merge,走完了,传入的对象...

laokaizzz的专栏 1万+

1985-2021年30m全国逐年土地覆被数据(含分省数据)

基于CLCD,揭示了1985年至2019年期间中国土地覆被变化的趋势和模式,如不透水表面(+148.71%)和水(+18.39%)的扩大,耕地(-4.85%)和草地(-3.29%)的减少,以及森林(+4.34%)的增加。由于中国的一系列造林政策,如1980年代启动的三北防护林工程和2000年后启动的绿色增益工程,从1985年到 2019年,森林增加了4.34%,灌木减少了259万公顷,与 ESACCI_LC的减少趋势相似。尽管为了养活不断增长的人口,中国东北和西北地区进行了广泛的开垦,但耕地普遍减少。

J_Giser的博客 1469

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JPA踩坑记:Spring Data Jpa 更新为null的问题(save方法保存时null值会被更新到数据库)

关键字: JPA更新为null,JPA save null,JPA保存为null 今天使用jpa的save方法时发现null字段也会被更新到数据库,这个直接把数据库数据覆盖的行为很可怕,果断研究了一下怎样能不保存null值。 解决方案: 实体类加@DynamicInsert(true)/@DynamicUpdate(true)注解; 扩展SimpleJpaRepository覆盖save方...

adu003的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SpringBoot实现JPA的save操作

  在一次参与公司的技术讨论会上,一位同事在演示SpringBoot的JPA的操作时,发现SpringBoot的JPA的save操作时,发现会先有select再insert,然后老板说,我们在网关已经处理过select了,我们调用save肯定是想直接保存的,所以这个问题记下来,下面去解决下这个问题。虽然只是实习生,但是还是想知道这个问题的,如果就自己试了下,想知道里面的原因。 StudentRe...

ArvinYL 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring Data Jpa中的save和saveAndFlush方法

Spring Data Jpa中save和saveAndFlush的区别,首先直接看图: save是CurdRepository接口下的方法 saveAndFlush是JpaRepository接口下的方法 一般情况下,我们仅仅使用save方法就可以满足业务需求。但是如果在同一个事务中,例如在方法上添加了@Transactional注解,我们想先保存Order(订单)数据,然后直接在这个事务中保存OrderItem(订单明细)数据,但是OrderItem需要前面所新建的Order里面的ID,这个时

北辰 4228

java jpa save方法辅助工具类

java jpa save方法更新数据工具类 因为jpa没有单独更新某些字段的方法,save方法可以更新某条数据,但是有一个缺陷,就是它会将为空的字段也更新上去. 如果有一个工具类可以将一个实体类非空的数据映射到jpa的findOne数据上,再进行save,就会方便很多.如下: import com.alibaba.druid.util.StringUtils; import org.spr...

qq_40016813的博客 653

Spring data Jpa修改操作

Jpa进行update操作的方式: 1.save操作: 先通过查询方法找到要修改的实例,然后通过setXXX对属性进行修改,最后进行save操作。 //根据输入指令流水号查询未完成的操作 InstInput instInput = instInputRepository.findByInputNo(Long.valueOf(inputNo)); log.info("AccountCo...

业精于勤,荒于嬉 1万+

Spring JPA

JPA

weixin_45815335的博客 4586

06 Spring Boot整合 Spring Data JPA

JPA (Java Persistence API) : 是Sun 官方提出的Java 持久化规范。Spring Data JPA 是Spring Data 的一个子项目,通过提供基于JPA 的Respository极大地减少了JPA 作为数据访问方案的代码量。 通过Spring Data JPA 框架, 开发者可以省略实现持久层业务逻辑的工作,唯一要做的就是声明持久层的接口,其他都交给Spri...

数据知道的博客 2万+

Mybatis和JPA混用因事务管理器错误使用导致JPA的save方法失效

无论怎么操作,虽然JPA save 对象保存成功了但是就是数据库中找不到插入的记录。

极客星云-优快云博客 5039

JPA实体类有Id保存也会新增一条新的数据问题

撸了今年阿里、网易和美团的面试,我有一个重要发现.......>>> ...

王念的博客 2436

java jpa save,详解SpringBoot实现JPA的save方法不更新null属性

序言:直接调用原生Save方法会导致null属性覆盖到数据库,使用起来十分不方便。本文提供便捷方法解决此问题。核心思路如果现在保存某User对象,首先根据主键查询这个User的最新对象,然后将此User对象的非空属性覆盖到最新对象。核心代码直接修改通用JpaRepository的实现类,然后在启动类标记此实现类即可。一、通用CRUD实现类public class SimpleJpaReposito...

weixin_39612733的博客 1686
上一篇: RabbitMQ安装后无法访问15672端口
下一篇: Spring AOP 通知 同一 Aspect 和不同 Aspect 中通知的执行顺序
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值