从其他项目注册EntityManager

时间:2014-11-20 17:47:19

标签: java hibernate maven

我创建了一个带有jar包装的maven实用程序项目,我在其中实现了EntityManager接口来管理数据库连接和东西。但是当我想在@Inject中使用它(来自另一个maven项目)时它不起作用。

有没有办法指定我要使用哪个EntityManager实现?

重要说明:如果我在主项目中包含此EntityManager,它可以正常工作。但是我试图避免这种情况,因为将来我会使用同一个数据库进行其他项目。

这是我的例外。

org.jboss.weld.exceptions.DeploymentException:WELD-001408在注入点[[field] @Inject private com.gtwpedidos.test.CanalSurDao.em]中带有限定符[@Default]的[EntityManager]类型的不满意依赖项     在org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:275)     在org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244)     在org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107)     在org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127)     在org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346)     在org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331)     在org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366)     在org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83)     在org.jboss.as.weld.services.WeldService.start(WeldService.java:76)     at org.jboss.msc.service.ServiceControllerImpl $ StartTask.startService(ServiceControllerImpl.java:1811)     at org.jboss.msc.service.ServiceControllerImpl $ StartTask.run(ServiceControllerImpl.java:1746)     at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:895)     at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:918)     在java.lang.Thread.run(Thread.java:695)

1 个答案:

答案 0 :(得分:0)

我认为正确的做法是:

  • 第一步:将您的实用程序项目设为EJB,并在此EJB内注入EntityManager @PersistenceContext注释。这样,EntityManager将由EJB处理,即,当@Stateless bean被销毁时创建并销毁@Stateless bean时,就会创建EntityManager。

  • 第二步:使用utility EJB注释

  • 在主项目的EJB中注入@EJB

粗略的例子:

UTILITY EJB

@Stateless(name="UtilityEJB", mappedName="UtilityEJBGlobal")
public class UtilityEJB 
{

    @PersistenceContext(unitName = "PRIMARY_PERSISTENCE_UNIT")
    public EntityManager em;

    //other stuff   ......
}

主要项目

@Stateless
public class Main
{

    @EJB(mappedName="UtilityEJBGlobal")
    private UtilityEJB utilityEJB ;

    //other stuff   ......

}

在我的情况下,我必须使用映射的namings,以便我的主项目找到已部署的EJB并将其注入主要项目。

希望有所帮助