1. Overview

We usually don’t need to access the EntityManager directly when working on a Spring Data application. However, sometimes we may want to access it, like to create custom queries or to detach entities.

In this quick tutorial, we’ll learn how to access the EntityManager by extending a Spring Data Repository.

2. Access EntityManager With Spring Data

We can get the EntityManager by creating a custom repository that extends, for instance, a built-in JpaRepository.

First, we’ll define an example Entity for the users we want to store in a database:

public class User {
    private Long id;
    private String name;
    private String email;
    // ...

We don’t have direct access to the EntityManager in a JpaRepository, and therefore we need to create our own.

Let’s create one with a custom find method:

public interface CustomUserRepository {
    User customFindMethod(Long id);

Using @PeristenceContext, we can inject the EntityManager in the implementation class:

public class CustomUserRepositoryImpl implements CustomUserRepository {

    private EntityManager entityManager;

    public User customFindMethod(Long id) {
        return (User) entityManager.createQuery("FROM User u WHERE u.id = :id")
          .setParameter("id", id)

Likewise, we can use the @PersistenceUnit annotation, in which case we’ll access the EntityManagerFactory, and from it, the EntityManager.

Finally, we’ll create a Repository that extends both the JpaRepository and CustomRepository:

public interface UserRepository extends JpaRepository<User, Long>, CustomUserRepository {

In addition, we can make a Spring Boot application, and test to check that everything is tied up and working as expected:

@SpringBootTest(classes = CustomRepositoryApplication.class)
class CustomRepositoryUnitTest {

    private UserRepository userRepository;

    public void givenCustomRepository_whenInvokeCustomFindMethod_thenEntityIsFound() {
        User user = new User();
        user.setEmail("[email protected]");

        User persistedUser = userRepository.save(user);

        assertEquals(persistedUser, userRepository.customFindMethod(user.getId()));

3. Conclusion

In this article, we looked at a quick example of accessing the EntityManager in a Spring Data application. We can access the EntityManager in a custom repository, and still use our Spring Data Repository by extending its functionality.

As always, the code for these examples is available over on GitHub.

Course – LSD (cat=Persistence)

Get started with Spring Data JPA through the reference Learn Spring Data JPA course:

res – Persistence (eBook) (cat=Persistence)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.