Springデータを使用してEntityManagerにアクセスする方法
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;
// ...
}
直接アクセスすることはできません
カスタム検索メソッドを使用して作成してみましょう。
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でから入手できます。