Hibernate/JPA中避免save()冗餘呼叫

banq發表於2019-02-09

對於託管實體呼叫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");        
    }
    
}

 

相關文章