1. 概要

通常、にアクセスする必要はありません EntityManager SpringDataアプリケーションで作業しているときに直接。 ただし、カスタムクエリを作成したり、エンティティをデタッチしたりするために、アクセスしたい場合があります。

この短いチュートリアルでは、Spring Data Repositoryを拡張してEntityManagerにアクセスする方法を説明します。

2. SpringDataを使用してEntityManagerにアクセスします

EntityManager を取得するには、たとえば、組み込みのJpaRepositoryを拡張するカスタムリポジトリを作成します。

最初に、データベースに保存するユーザーに対して、たとえば エンティティを定義しましょう:

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

直接アクセスすることはできません JpaRepositoryのEntityManager。 したがって、独自に作成する必要があります。

カスタム検索メソッドを使用して作成してみましょう。

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("[email protected]");
        user.setName("userName");

        User persistedUser = userRepository.save(user);

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

3. 結論

この記事では、SpringDataアプリケーションでEntityManagerにアクセスする簡単な例を紹介しました。

カスタムリポジトリのEntityManagerにアクセスし、その機能を拡張することでSpringデータリポジトリを引き続き使用できます。

いつものように、これらの例のコードはGitHubから入手できます。