大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
JPA中save和saveAndFlush的区别,首先直接看图:
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。
进入方法,找到实现,主要逻辑
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账号...