jpa的save方法_save与preserve的区别

jpa的save方法_save与preserve的区别JPA中save和saveAndFlush的区别,首先直接看图:save是CrudRepository下的。saveAndFlush是JpaRepository下的。一般情况下save就足够了,但是如果在同一个transaction里,比如你在方法上标了@Transactional,这时你想先保存Order,然后直接在这个Transaction里保存OrderItem,但是Orde…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

JPA中save和saveAndFlush的区别,首先直接看图:

jpa的save方法_save与preserve的区别

save是CrudRepository下的。

saveAndFlush是JpaRepository下的。

这里的flush就相当于你在数据库里执行了一条sql语句,但是没commit。

flush不是commit。

flush不是commit。

flush不是commit。

commit是事务提供的方法,只有commit以后,你执行的sql语句插入或者修改的数据才能被其他事务看到,除非你改隔离级别为READ_UNCOMMITTED。

讲到这儿,一些小伙伴就已经明白了,但是还有些萌新可能会被Transaction给蒙住。

Transaction是数据库提供的服务,JPA只是按照数据库厂商提供的规范封装扩展了一下。你可能疑问,执行了SQL语句,其他事务是可以看见的,那是因为默认是自动commit的,你可以改成手动模式set auto_commit = 0; 然后通过数据指令 commit,rollback。

别下次了,点赞收藏走起!

上进的同学可能还会问,不用flush,数据也是会同步到数据库的,为什么呢?

在查询数据exectureQuery之前,或者执行事务Transaction.commit()之前。

我们根据是来自JPA的FlushModeType。

public enum FlushModeType {

    /** Flushing to occur at transaction commit. The provider may flush

    * at other times, but is not required to.

    */

    COMMIT,


    /** (Default) Flushing to occur at query execution. */

    AUTO
}

Hibernate的FlushMode要多一些。

FlushMode

ALWAYS

The Session is flushed before every query.

AUTO

The Session is sometimes flushed before query execution in order to ensure that queries never return stale state.

COMMIT

The Session is flushed when Transaction.commit() is called.

MANUAL

The Session is only ever flushed when Session.flush() is explicitly called by the application.

NEVER

Deprecated. use MANUAL instead.

那么我们就找到处理select query的代码,可以发现执行性之前会call一下autoFlushIfRequired。

jpa的save方法_save与preserve的区别

进入方法,找到实现,主要逻辑

if ( flushMightBeNeeded( source ) ) {

    flushEverythingToExecutions( event );

    if ( flushIsReallyNeeded( event, source ) ) {

    // flush

对源码感兴趣的可以自行下载hibernate代码看起来,并不是很复杂,这里我们只看下判断是否flush的代码:

private boolean flushIsReallyNeeded(AutoFlushEvent event, final EventSource source) {

    // FlushMode.ALWAYS 或者action queue里有table需要update

    return source.getHibernateFlushMode() == FlushMode.ALWAYS

        || source.getActionQueue().areTablesToBeUpdated( event.getQuerySpaces() );

}



private boolean flushMightBeNeeded(final EventSource source) {

    final PersistenceContext persistenceContext = source.getPersistenceContextInternal();

    // FlushMode不低于AUTO,并且当前session的context里有managed entity或者collection entry

    return !source.getHibernateFlushMode().lessThan( FlushMode.AUTO )

        && ( persistenceContext.getNumberOfManagedEntities() > 0

        || persistenceContext.getCollectionEntriesSize() > 0 );

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179893.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js原生、jquery单选框radio总结(获取值、设置默认选中值、样式)

    js原生、jquery单选框radio总结(获取值、设置默认选中值、样式)单选框radio<divclass="radio-inline"><inputtype="radio"name="killOrder"value="1"/><labelfor="killOrder1">是</label></div>&

    2022年5月30日
    227
  • Java设计模式之模板方法模式(Template Method)

    本文属于23种设计模式系列,介绍的是模板方法模式。

    2022年3月11日
    37
  • 行为识别综述

    行为识别综述定义背景难点最新论文最新算法数据集1定义行为识别:行为识别(ActionRecognition)任务是从视频剪辑(2D帧序列)中识别不同的动作,其中动作可以在视频的整个持续时间内执行或不执行。行为识别似乎是图像分类任务到多个帧的扩展,然后聚合来自每帧的预测。尽管图像分类取得了很大的成功,但是视频分类和表示学习依然进展缓慢。2背景2.1方法2.1.1传统方法提取视频区域的局部高维视觉特征,然后组合成固定大小的视频级描述,最后利用分类器(SVM,RF等)进行最终预测2.

    2022年6月21日
    28
  • 几种常见mybatis分页实现[通俗易懂]

    几种常见mybatis分页实现[通俗易懂]mybatis框架分页实现,有几种方式,最简单的就是利用原生的sql关键字limit来实现,还有一种就是利用interceptor来拼接sql,实现和limit一样的功能,再一个就是利用PageHelper来实现。这里讲解这三种常见的实现方式:无论哪种实现方式,我们返回的结果,不能再使用List了,需要一个自定义对象Pager。packagecom.xxx.mybatis.bean;…

    2022年10月20日
    3
  • xshell连接虚拟机步骤_安装虚拟机后如何使用

    xshell连接虚拟机步骤_安装虚拟机后如何使用Xshell连接虚拟机1、打开虚拟机终端,输入下面命令,找到ens33对应的IP地址,如图ifconfig2、打开Xshell,打开文件–>新建3、填写名称,主机这里填入刚才的IP,点击连接4、输入登录的用户名,点击确定5、输入密码,点击确定6、连接成功,可以开始使用…

    2022年9月23日
    3
  • WeakHashMap类

    WeakHashMap类一代码示例importjava.util.*;publicclassWeakHashMapTest{ publicstaticvoidmain(String[]args) { WeakHashMapwhm=newWeakHashMap(); //HashMapwhm=newHashMap(); //将WeakHashM…

    2022年5月31日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号