Why does getOne(…) on a Spring Data repository not throw an EntityNotFoundException?

This is due to the way JPA specifies EntityManager.getReference(…) to work. It's supposed to return a proxy that will either resolve the object to be returned on the first access of a property or throw the contained exception eventually.

The easiest way to work around this is to simply use findOne(…) instead, like this Optional.ofNullable(repository.findOne(…)). findOne(…) will return nullin case no result is found.

A more advanced way of resolving this is to make the repository return Optional instances directly. This can be achieved by creating a custom base repository interface using Optional<T> as return type for the find…-methods.

interface BaseRepository<T, ID extends Serializable> extends Repository<T, ID> {

  Optional<T> findOne(ID id);

  // declare additional methods if needed
}

interface YourRepository extends BaseRepository<DomainClass, Long> { … }

Find a complete example of this in the Spring Data examples repository.


In Spring @Repository classes, the getOne(id) method doesn't always verify existence until the object is queried (by calling entity.getId() or something) so it's no-such-entity exception may be delayed. To validate right away, use findById(id) instead (which returns an Optional<EntityType> which will be empty if the entity with that id doesn't exist).


This is how it worked for me

public User findUserById(Long id) {
    return userRepository.findById(id).orElse(null);
}