【发布时间】:2022-02-25 17:45:15
【问题描述】:
首先,对于那些想知道如何在扩展 JpaRepository 的接口中使用 EntityManager 的人。 这是一个潜在的解决方案。 但 !!!我知道这可能是一种 baaaad 做法,Spring 和 JPA 中经验丰富的人可能会试图杀死我;)道歉......
所以,在这个大警告之后,这是我的问题:
我只想使用没有自定义实现的接口,这就是我所做的:
@Repository
@Transactional
public interface BookingDao extends JpaRepository<Booking, Long> {
Booking findByCodeId(String codeId);
void deleteByCodeId(String codeId);
default Integer findCountOfBookingOldDay() {
EntityManager entityManager = ApplicationContextProvider.getEntityManager();
Query query = entityManager.createNativeQuery("XXXX");
Number result = (Number) query.getSingleResult();
return result.intValue();
}
}
@Component(value = "applicationContextProvider")
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
public static ApplicationContext getApplicationContext() {
return context;
}
public static EntityManager getEntityManager() {
return EntityManagerFactoryUtils.getTransactionalEntityManager(context.getBean(LocalContainerEntityManagerFactoryBean.class).getObject());
return context.getBean(EntityManager.class);
}
@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
context = ac;
}
}
我知道这可能不是最佳实践,最好的方法是在一个类中使用 @PersistenceContext(注意为每个线程创建一个唯一的 EntityManager)......但是在我的情况下最好的选择:
这个:
return EntityManagerFactoryUtils.getTransactionalEntityManager(context.getBean(LocalContainerEntityManagerFactoryBean.class).getObject());
或者这个:
return context.getBean(EntityManager.class)
或者可能是另一种更好的方法,仍然只使用界面。
感谢您的评论/建议。
PS:“EntityManagerFactoryUtils”和 PersistenceContext 做的不一样?
【问题讨论】:
标签: java spring spring-data-jpa