java - 从其他项目注册EntityManager

标签 java hibernate maven

我创建了一个带有 jar 打包的 Maven 实用程序项目,其中我实现了 EntityManager 接口(interface)来管理数据库连接和其他内容。但是当我想将它(来自另一个 Maven 项目)与 @Inject 一起使用时,它不起作用。

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

重要提示:如果我将此 EntityManager 包含在主项目中,它就可以工作。但我试图避免这种情况,因为将来我会有其他项目使用相同的数据库。

这是我的异常(exception)情况。

org.jboss.weld.exceptions.DeploymentException:WELD-001408 类型 [EntityManager] 与注入(inject)点 [[field] @Inject private com.gtwpedidos.test.CanalSurDao.em] 处带有限定符 [@Default] 的依赖关系不满足 在 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) 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) 在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 在 java.lang.Thread.run(Thread.java:695)

最佳答案

我认为正确的方法是:

  • 第一个:使您的实用程序项目成为一个 EJB 并在这个 EJB 内注入(inject)您的 EntityManager 以及 @PersistenceContext 注释。这样,EntityManager 将由 EJB 处理,即 EntityManager 在创建时创建,例如,创建 @Stateless bean 时创建,并在销毁 @Stateless bean 时销毁。

  • 第二:使用 @EJB 注释将 实用程序 EJB 注入(inject)主项目的 EJB

粗略示例:

实用程序 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   ......

}

就我而言,我必须使用映射的命名,以便我的主项目找到已部署的 EJB 并将其注入(inject)到主项目中。

希望对你有帮助

关于java - 从其他项目注册EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27046165/

相关文章:

java - 如果未提供范围,为什么 Glassfish 不会启动失败但 Tomcat 会启动?

mysql - Hibernate能够连接到mysql,但Spring JPA不能连接

java - Hibernate 子查询.exists

java - IntelliJ IDEA maven 运行/调试配置,maven 目标已运行但应用程序未自动运行

java - 如何从 R.raw 设置 Sound RingtoneManager

Java 整数对象的反射

Hibernate:如何持久保存包含 Map<String, List<String>> 的类

java - Maven:未请求的 jar 污染了我的 lib 文件夹

java - cucumber - java.lang.NoClassDefFoundError

java - Junit 和 Hamcrest 的单元测试失败 - 无法将数据与两个列表对象进行比较