1. 概述
在使用Spring Data应用程序时,我们通常不需要直接访问EntityManager
。然而,有时我们可能需要这样做,比如执行自定义查询或分离实体。
在这篇简短教程中,我们将学习如何通过扩展Spring Data的Repository来访问EntityManager
。
2. 通过Spring Data访问EntityManager
我们可以通过创建一个自定义仓库,例如继承内置的JpaRepository
,来获取EntityManager
。
首先,我们定义一个示例实体,用于存储数据库中的用户:
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private String email;
// ...
}
在JpaRepository
中,我们没有直接访问EntityManager
的方法,因此我们需要自己创建。
让我们创建一个带有自定义查找方法的仓库:
public interface CustomUserRepository {
User customFindMethod(Long id);
}
通过使用@PersistenceContext
注解,我们可以在实现类中注入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
:
@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. 总结
在这篇文章中,我们探讨了在Spring Data应用中访问EntityManager
的一个快速示例。我们可以在自定义仓库中访问EntityManager
,同时通过扩展其功能继续使用Spring Data Repository。
如往常一样,这些示例的代码可在GitHub上找到。