对于托管实体调用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"); } }
|