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 );

}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

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