0

我在春天有一个问题,自动装配带有一个具有原型范围的 bean。所以基本上我正在编写一个带有 JPA 的代码。所以我在我的 DAO 层中自动装配我的实体管理器。我正在加载实体管理器通过使用 @configuraion Annotation 从一个类中。

@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..

如果有人能回答我的问题,我将不胜感激..

谢谢, 斯瓦蒂

4

2 回答 2

2

用于@PersistenceContext注入 EntityManager,而不是Spring 参考指南@AutowiredJPA 部分所述。它会为您妥善处理生命周期。

至于为什么它没有像你想象的那样工作:每当你的 DAO 实例被创建时,它就会被注入一个 EntityManager。由于 EntityManager 是 scope=prototype,因此将为每个需要注入的 DAO 创建一个新的。但是,由于您的 DAO 是一个单例,因此只创建了其中一个,因此只需要一个 EntityManager。

于 2013-02-14T06:02:33.900 回答
0
@Inject // or @Autowire
Provider<EntityManager> entityManagerProvider;

然后使用 entityManagerProvider.get() 获取 EntityManager 实例。

我使用javax.inject.Inject而不是Autowire因为Provider在那里也定义了。这也适用于 Guice。

于 2013-04-23T06:40:17.823 回答