findById() — loads entity immediately. getReferenceById() — returns proxy (lazy).
findById():
1Optional<User> user = userRepository.findById(1L);2// SQL executed: SELECT * FROM users WHERE id = 1
getReferenceById():
1User user = entityManager.getReferenceById(User.class, 1L);2// No SQL yet3String name = user.getName();4// SQL executed: SELECT * FROM users WHERE id = 1
How it works:
When to use:
Common pitfalls: