前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >jpa的save方法_save与preserve的区别

jpa的save方法_save与preserve的区别

作者头像
全栈程序员站长
发布2022-11-01 16:14:05
8920
发布2022-11-01 16:14:05
举报
文章被收录于专栏:全栈程序员必看

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

jpa的save方法_save与preserve的区别
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。

代码语言:javascript
复制
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要多一些。

代码语言:javascript
复制
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的区别
jpa的save方法_save与preserve的区别

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

代码语言:javascript
复制
if ( flushMightBeNeeded( source ) ) {

    flushEverythingToExecutions( event );

    if ( flushIsReallyNeeded( event, source ) ) {

    // flush

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

代码语言:javascript
复制
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.cn/179893.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档