Hibernate/JPA中避免save()冗余调用


对于托管实体调用save是一个坏主意,因为Hibernate使用脏检查机制来帮助我们避免这种冗余调用。

关键点:

  • Hibernate对于托管实体会触发UPDATE语句,无需显式调用save()方法
  • 在幕后,进行冗余save()调用意味着性能损失(见这里


@SpringBootApplication
public class RedundantSaveApplication {

    private static final Logger logger = Logger.getLogger(RedundantSaveApplication.class.getName());
        
    @Autowired
    private UserService userService;        

    public static void main(String[] args) {
        SpringApplication.run(RedundantSaveApplication.class, args);
    }

    @Bean
    public ApplicationRunner init() {
        return args -> {

            userService.updateUserNameViaRedundantSave();
            userService.updateUserNameRecommended();
        };
    }
}

@Repository
public interface UserRepository extends JpaRepository<User, Long> {        
}

@Service
public class UserService {
    
    @Autowired
    private UserRepository userRepository; 
    
    @Transactional
    public void updateUserNameViaRedundantSave(){
        User user = userRepository.findById(1L).get();
        
        user.setName("Hulyo G");
        userRepository.save(user);
//冗余
    }
    
    @Transactional
    public void updateUserNameRecommended(){
        User user = userRepository.findById(1L).get();
        
        user.setName(
"Magic J");        
    }
    
}