Перейти к основному содержимому

Как получить доступ к EntityManager с данными Spring

· 2 мин. чтения

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 .