save() — saves to persistence context. saveAndFlush() — saves and immediately writes to DB.
save():
1@Service2@Transactional3public class UserService {4 public void createUsers() {5 for (int i = 0; i < 1000; i++) {6 repo.save(new User("user" + i));7 }8 // All 1000 users saved at commit9 }10 // COMMIT → single batch INSERT11}
saveAndFlush():
1@Service2@Transactional3public class UserService {4 public void createUserWithImmediateSave() {5 User user = repo.saveAndFlush(new User("Alice"));6 // SQL executed immediately7 System.out.println("ID: " + user.getId());8 }9 // COMMIT → no additional SQL10}
How it works:
Key difference:
Best practice: