如何使用Spring Data访问EntityManager

2023/05/18

1. 概述

在处理Spring Data应用程序时,我们通常不需要直接访问EntityManager。但是,有时我们可能想要访问它,例如,创建自定义查询或分离实体。

在这个简短的教程中,我们将了解如何通过扩展Spring Data Repository来访问EntityManager。

2. 使用Spring Data访问EntityManager

我们可以通过创建一个自定义Repository来获取EntityManager,该Repository扩展了例如内置的JpaRepository

首先,让我们定义一个Entity,例如,为我们要存储在数据库中的用户:

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

我们无法直接访问JpaRepository中的EntityManager。因此,我们需要创建自己的。

让我们使用自定义查找方法创建一个自定义的Repository接口:

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

@Repository
public interface UserRepository extends JpaRepository<User, Long>, CustomUserRepository {
}

此外,我们可以创建一个Spring Boot应用程序并进行测试,以检查一切是否正常并按预期工作:

@SpringBootTest(classes = CustomRepositoryApplication.class)
class CustomRepositoryUnitTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    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. 总结

在本文中,我们查看了在Spring Data应用程序中访问EntityManager的快速示例。

我们可以访问自定义Repository中的EntityManager,并且仍然可以通过扩展其功能来使用我们的Spring Data Repository。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章