我在春天有一个问题,带有一个带有原型范围的bean的autowire。 所以基本上我正在编写一个JPA的代码。所以我在我的DAO层自动装配我的实体管理器。我正在使用@configuraion Annotation从类中加载entitymanager。
@Configuration
public class DALConfigurationLoader {
@Bean
@Scope("prototype")
public EntityManager getEntityManager() {
}
当我这样做时,我希望每次请求都能得到一个新的bean。
@Component
public class OfferPriceDomainDAOImpl {
@Autowired
private EntityManager entityManager;
public OfferPrice getOfferPrice(String offer_Price_Id) throws DataAccessException{
//use entitymanager here
}
}
在这种情况下,它是所有请求的单个实体管理器,这是错误的。我希望每个方法都应该获得一个新的实体管理器。根据jpa规范,每个新请求都应该处理一个新的实体管理器...我可以使用原型范围自动装配一个bean ..
如果有人能回答我的问题,我真的很感激。
感谢, 斯瓦特
答案 0 :(得分:2)
使用@PersistenceContext
注入EntityManager,而不是@Autowired
,如JPA section of the Spring reference guide中所述。它会妥善处理您的生命周期。
至于为什么它没有像你想象的那样工作:无论何时创建DAO实例,都会注入EntityManager。由于EntityManager是scope = prototype,因此将为每个需要为一个DAO注入的DAO创建一个新的。但是,由于您的DAO是单例,因此只创建其中一个,因此只需要一个EntityManager。
答案 1 :(得分:0)
@Inject // or @Autowire
Provider<EntityManager> entityManagerProvider;
然后使用entityManagerProvider.get()获取EntityManager实例。
我使用javax.inject.Inject
代替Autowire
,因为Provider
也在那里定义。这也适用于Guice。