1. Обзор
Обычно нам не нужно напрямую обращаться к EntityManager
при работе с приложением Spring Data. Однако иногда нам может понадобиться получить к нему доступ, например, для создания пользовательских запросов или для отсоединения объектов.
В этом кратком руководстве мы увидим, как получить доступ к EntityManager
, расширив репозиторий данных Spring .
2. Доступ к EntityManager
с данными Spring
Мы можем получить EntityManager
, создав собственный репозиторий, расширяющий, например, встроенный JpaRepository
.
Во-первых, давайте определим Entity
, например, для пользователей, которых мы хотим хранить в базе данных:
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private String email;
// ...
}
У нас нет прямого доступа к EntityManager в
JpaRepository .
Поэтому нам нужно создавать свои собственные.
Давайте создадим его с помощью пользовательского метода поиска:
public interface CustomUserRepository {
User customFindMethod(Long id);
}
Используя @PeristenceContext
, мы можем внедрить EntityManager
в класс реализации :
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();
}
}
Точно так же мы можем использовать аннотацию @PersistenceUnit
, и в этом случае мы получим доступ к EntityManagerFactory
и из него к EntityManager
.
Наконец, давайте создадим репозиторий
, который расширяет как JpaRepository
, так и CustomRepository
:
@Repository
public interface UserRepository extends JpaRepository<User, Long>, CustomUserRepository {
}
Кроме того, мы можем создать приложение Spring Boot
и протестировать, чтобы убедиться, что все подключено и работает как положено:
@SpringBootTest(classes = CustomRepositoryApplication.class)
class CustomRepositoryUnitTest {
@Autowired
private UserRepository userRepository;
@Test
public void givenCustomRepository_whenInvokeCustomFindMethod_thenEntityIsFound() {
User user = new User();
user.setEmail("foo@gmail.com");
user.setName("userName");
User persistedUser = userRepository.save(user);
assertEquals(persistedUser, userRepository.customFindMethod(user.getId()));
}
}
3. Заключение
В этой статье мы рассмотрели быстрый пример доступа к EntityManager
в приложении Spring Data.
Мы можем получить доступ к EntityManager
в пользовательском репозитории и по-прежнему использовать наш репозиторий данных Spring, расширив его функциональность.
Как всегда, код этих примеров доступен на GitHub .