如何以编程方式实例化注入EntityManager?

时间:2014-03-04 02:49:19

标签: spring dao spring-3

具有此通用DAO定义

@Repository
public class GenericService<T> implements IGenericService<T> {
    @PersistenceContext(unitName="mgrUnit", name="mgrEMF")
    @Qualifier(value = "mgrEMF")
    public void setEm(EntityManager em) {       
        this.em = em;       
        util = em.getEntityManagerFactory().getPersistenceUnitUtil();       
    }
}

并拥有大量实体,我想自动实现DAO,后端Bean用于基本表,如(Region,EmployeSpeciality ...)

对于bean注册和实例来说,这很容易,但DAO呢? 我必须确切地说,在我的情况下,EntityManager依赖于服务,我有多个数据库连接。

我读过这篇文章,但是看起来很复杂

http://doanduyhai.wordpress.com/2011/11/20/spring-transactional-explained/

有一种简单的方法吗?

好的,使用

AutowireCapableBeanFactory beanFactory = 
FacesUtils.getWebappContext().getAutowireCapableBeanFactory();
beanFactory.autowireBean(obj);

它解决了问题的一半,Bean EMF被正确注入,但bean没有被注册(我必须在每次需要时重新安装它),因为beanFactory不包含Bean Definition,所以如何添加它?

NB:我知道将对象放在应用程序MAP中可以保持DAO可访问但不是一个严肃的解决方案

FacesContext.getCurrentInstance().getExternalContext().
            getApplicationMap().put( serviceName, service);

1 个答案:

答案 0 :(得分:0)

IGenericService service = (IGenericService) ContextManager.findBean( serviceName );     
if (service==null && !FacesUtils.getWebappContext().getBeanFactory().
           containsBeanDefinition(serviceName)){

   service = new ErpGenericService(clazz);
   AutowireCapableBeanFactory beanFactory = FacesUtils.getWebappContext().
                                             getAutowireCapableBeanFactory();
   beanFactory.autowireBean(service);
   //Applying transactional proxies
   service = (IGenericService) beanFactory.applyBeanPostProcessorsAfterInitialization(service, serviceName);
   FacesUtils.getWebappContext().getBeanFactory().
                     registerSingleton(serviceName, service);                       

}