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


相关推荐

  • Java对象序列化详解

    Java对象序列化详解所有分布式应用常常需要跨平台,跨网络,因此要求所有传的参数、返回值都必须实现序列化。一、定义  序列化:把Java对象转换为字节序列的过程。    反序列化:把字节序列恢复为Java对象的过程。二、用途  对象的序列化主要有两种用途:    1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象)    2)在网络上传送对象的字节序列。(网络传输对象)…

    2022年6月22日
    28
  • python matplotlib 安装 和错误处理

    python matplotlib 安装 和错误处理pythonmatplotlib安装和错误处理,错误处理亲测十分有效。

    2022年6月22日
    31
  • 商品销售管理系统

    用JSPservlet和jquery以及SQLServer数据库实现商品销售管理系统。功能详解:1.查询商品2.添加商品3.删除商品4.添加销售记录5.查看销售记录效果演示:进入界面商品显示页面删除提示销售记录查询商品销售系统需要SQLServer数据库和程序两大部分一:设计并实现数据库二:程序设计在程序正式开始之前先看一下目录结构吧==特别注意:==…

    2022年4月4日
    38
  • pycharm的配置_pycharm添加编译器

    pycharm的配置_pycharm添加编译器一、Pycharm简介与安装简介Pycharm与VScode一样,都可以作为python的可视化IDE,功能很强大,可以帮助我们提高编程的效率。包括调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。安装作为一个穷孩子,建议还是安装社区免费版,因为社区免费版与专业版无差别,功能是齐全的。安装地址在这里!二、Pycharm配置作为python编程的ID…

    2022年8月28日
    0
  • 免费.NET代码生成器KevinCodeBuilder「建议收藏」

    .NET代码生成器KevinCodeBuilder>>>免费下载:百度云CSDN>>>点击学习:视频教程+完整源码自己在做.NET开发的时候,简单的三层架构会有很多重复的代码,如果手敲会比较浪费时间。前段时间在互联网找了下.net的代码生成器,发现要么太复杂甚至生成的代码会报错,要么要收费而且效果不是自己想要的。所以,干脆…

    2022年4月14日
    103
  • Charles抓包显示乱码解决方法

    Charles抓包显示乱码解决方法

    2021年6月16日
    136

发表回复

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

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