2013-02-14 96 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也是在那裏定義的。此外,這也將在吉斯工作。