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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 第三版信息系统项目管理师47个过程的输入输出及工具「建议收藏」

    第三版信息系统项目管理师47个过程的输入输出及工具「建议收藏」第三版信息系统项目管理师47个过程的输入输出及工具

    2022年5月2日
    50
  • pycharm永久激活码2021【2021.7最新】

    (pycharm永久激活码2021)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSW…

    2022年3月21日
    86
  • 心脏与阴影,求阴影部分

    心脏与阴影,求阴影部分

    2022年1月9日
    45
  • 【嵌入式】基于ARM的嵌入式Linux开发总结

    【嵌入式】基于ARM的嵌入式Linux开发总结前言嵌入式知识点复习一嵌入式知识点复习二–体系结构嵌入式知识点复习三–ARM-LINUX嵌入式开发环境嵌入式知识点复习四–arm-linux文件编程嵌入式知识点复习五–arm-linux进程编程嵌入式知识点复习六–arm-linux网络编程嵌入式知识点复习七–linux字符型设备驱动初步嵌入式知识点复习一1、嵌入式系统的一般组成结构2、嵌入式硬件系统的结构(1)…

    2022年6月10日
    36
  • cBridge 2.0: 基于Celer状态守卫者网络的通用跨链平台

    cBridge 2.0: 基于Celer状态守卫者网络的通用跨链平台自cBridge1.0版本上线以来,我们的跨链资金总量持续每周成倍增长,在上线第一个月,我们只处理了$10M的跨链转账金额,而在接下来的一个月中,cBridge跨链资金总量上涨到了$170M,每日跨链资金也稳定突破$10M关口。cBridge节点的流动性提供者,在没有任何额外激励的情况下,仅仅从跨链手续费上,就能获得45%的年化收益。这确实令人激动,但,这只是一个开始。今天我们高兴地宣布cBridge2.0的升级计划,并对这个充满创新的升级做一个简要的介绍。cBridge…

    2022年6月4日
    22
  • 【mysql 索引】mysql 添加索引

    【mysql 索引】mysql 添加索引主要内容:1、什么是索引2、添加索引sql3、索引所用的算法4、补充下概念5、索引的缺点6、经典案例一、什么是索引?  索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建

    2022年6月2日
    37

发表回复

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

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