Partner – JPA Buddy – NPI (tag=JPA/Hibernate)
announcement - icon

The right tools can and will save a lot of time. As long as you are using Hibernate and IntelliJ IDEA you can boost your coding speed and quality with JPA Buddy. It will help in a lot of the day-to-day work:

  • Creating JPA entities that follow best practices for efficient mapping
  • Creating DTOs from entities and MapStruct mappers using convenient visual tools
  • Generating entities from the existing database or Swagger-generated POJOs
  • Visually composing methods for Spring Data JPA repositories
  • Generating differential SQL to update your schema in accordance with your changes in entities
  • Autogenerating Flyway migrations and Liquibase changelogs comparing entities with the database or two databases
  • … and a lot more

Simply put, you'll learn and use the best practices of Hibernate and surrounding technology and become a lot more!

Definitely visit the JPA Buddy site to see its features in action closer.

Persistence top

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

>> CHECK OUT THE COURSE

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, for example, to create custom queries or to detach entities.

In this short tutorial, we'll see 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.

Firstly, let's define an Entity, for example, for the users we want to store in a database:

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String email;
    // ...
}

We don't have direct access to the EntityManager in a JpaRepository. 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 {

    @PersistenceContext
    private EntityManager entityManager;

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

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

Finally, let's create a Repository that extends both the JpaRepository and CustomRepository:

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

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

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

    @Autowired
    private UserRepository userRepository;

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

        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.

Persistence bottom

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

>> CHECK OUT THE COURSE
Persistence footer banner
Comments are closed on this article!