如何通过Spring Boot和Spring Data访问实体管理器

40

在使用Spring Boot和Spring Data时,我如何访问存储库中的Entity Manager

否则,我将需要将我的大查询放在注释中。我希望有比长文本更清晰的东西。

2个回答

40

您可以定义一个CustomRepository来处理这种情况。假设您有一个扩展默认Spring Data JPA接口JpaRepository<Customer,Long>CustomerRepository

创建一个新的接口CustomCustomerRepository,其中包含自定义方法签名。

public interface CustomCustomerRepository {
    public void customMethod();
}

使用 CustomCustomerRepository 扩展 CustomerRepository 接口

public interface CustomerRepository extends JpaRepository<Customer, Long>, CustomCustomerRepository{

}
创建一个名为CustomerRepositoryImpl的实现类,该类实现CustomerRepository接口。在这里,您可以使用@PersistentContext注入EntityManager。 命名约定在此处很重要。
public class CustomCustomerRepositoryImpl implements CustomCustomerRepository {

    @PersistenceContext
    private EntityManager em;

    @Override
    public void customMethod() {
    
    }
}

3
CustomerRepositoryImpl 类应该实现 CustomCustomerRepository 而不是 CustomerRepository,因为 CustomCustomerRepository 只需实现一个方法。 - Nikhil Mahajan
4
我收到了这个错误信息:“在类型Customer中找不到属性customMethod”,我需要进行一些设置吗? - Rookie007
1
如果您遇到错误“找不到类型为Customer的customMethod属性”,请删除@PersistenceContext注释,并通过CustomRepositoryImpl的构造函数注入entityManager对象。 - cnmuc
2
@AvikAggarwal 公共类 CustomerRepositoryImpl 实现 CustomCustomerRepository {private final EntityManager entityManager; public CustomerRepositoryImpl(EntityManager entityManager) { this.entityManager = entityManager; }} - cnmuc
1
CustomCustomerRepositoryImpl需要有@Repository注释吗? - khacsinhcs
显示剩余6条评论

2

如果您有许多存储库需要处理,并且您对 EntityManager 的需求不特定于任何特定的存储库,则可以在单个帮助程序类中实现各种 EntityManager 功能,可能是这样的:

@Service
public class RepositoryHelper {

    @PersistenceContext
    private EntityManager em;

    @Transactional
    public <E, R> R refreshAndUse(
            E entity,
            Function<E, R> usageFunction) {
        em.refresh(entity);
        return usageFunction.apply(entity);
    }

}

这里的refreshAndUse方法是一个示例方法,用于消耗一个分离的实体实例,对其进行刷新,并返回应用于刷新实体的自定义函数的结果,在声明式事务上下文中。您还可以添加其他方法,包括查询方法...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接