Using JpaContext
in Custom Implementations
When working with multiple EntityManager
instances and custom repository implementations, you need to wire the correct EntityManager
into the repository implementation class. You can do so by explicitly naming the EntityManager
in the @PersistenceContext
annotation or, if the EntityManager
is @Autowired
, by using @Qualifier
.
As of Spring Data JPA 1.9, Spring Data JPA includes a class called JpaContext
that lets you obtain the EntityManager
by managed domain class, assuming it is managed by only one of the EntityManager
instances in the application. The following example shows how to use JpaContext
in a custom repository:
JpaContext
in a custom repository implementationclass UserRepositoryImpl implements UserRepositoryCustom {
private final EntityManager em;
@Autowired
public UserRepositoryImpl(JpaContext context) {
this.em = context.getEntityManagerByManagedType(User.class);
}
…
}
The advantage of this approach is that, if the domain type gets assigned to a different persistence unit, the repository does not have to be touched to alter the reference to the persistence unit.