2013-02-14 94 views
0

我有一个问题在春天与自动装配与原型的范围的豆.. 所以基本上我正在写一个代码是弹簧与JPA.So我autowiring我的实体经理在我的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 
     } 

    } 

在这种情况下,它是所有请求的单一实体管理器,它是wrong.i希望每个方法应根据JPA规范得到一个新的实体管理器。随着每一个新的请求应该处理新的实体管理器...我怎么能自动装配与原型的范围豆..

我真的很感激,如果有人能回答我的问题..

感谢, 姆斯瓦蒂

回答

2

使用@PersistenceContext到注入一个EntityManager,而不是@Autowired,如JPA section of the Spring reference guide中所述。它会妥善处理您的生命周期。

至于为什么它不工作,你认为可能的方式:只要创建你的DAO的实例,它会用一个EntityManager注入。由于EntityManager是scope = prototype,所以需要为每个需要注入的DAO创建一个新的DAO。但是,由于您的DAO是单身人士,因此只创建其中的一个,因此只需要一个EntityManager。

+0

我不能使用@PersistenceContet结合的方式,我们创建实体管理我的不同。这是我们种按照我公司的规则...的Dbonfigloader一些事情,我们加载实体管理器,它自动装配到DAO层.... DAO lyer对象在bizz层自动装配...所以创建了dao的singelton对象..我只想要一个具有多个实体管理器的dao对象... – swati 2013-02-14 06:09:01

+0

所以基本上有多少次我称之为方法在道(这是singelton)多次实体经理必须创建..这是我的目标... – swati 2013-02-14 06:10:03

+0

如果你只是“种”遵守规则,那么我建议这是打破它的时间。这是'@ PersistenceContext'存在的一个确切问题,它可以非常好地完成并且只需很少的工作。否则,就我所知,管理EntityManager生命周期完全取决于您。做这件事的难办法是将你的DAO注入一个EntityManager工厂,然后为每个方法调用打开/关闭一个EntityManager。如果您使用的是Spring,我不知道这将如何处理Spring的事务管理。 – 2013-02-14 06:41:00

0
@Inject // or @Autowire 
Provider<EntityManager> entityManagerProvider; 

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

我用javax.inject.Inject而不是Autowire,因为Provider也是在那里定义的。此外,这也将在吉斯工作。