Java 注入休眠持久单元

Java 注入休眠持久单元,java,hibernate,jakarta-ee,glassfish,glassfish-4.1,Java,Hibernate,Jakarta Ee,Glassfish,Glassfish 4.1,通过使用CDI,如下面的代码所示: @PersistenceUnit EntityManagerFactory emf; 我想注入我的hibernateEntityManagerFactory 当前,如果我执行下一行: EntityManagerFactory emf = Persistence.createEntityManagerFactory("HibernatePersistanceProv"); 它的工作原理与预期一样,但如果我使用第一种方法,它会尝试使用Derby连接,我知道这一

通过使用CDI,如下面的代码所示:

@PersistenceUnit
EntityManagerFactory emf;
我想注入我的hibernate
EntityManagerFactory

当前,如果我执行下一行:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("HibernatePersistanceProv");
它的工作原理与预期一样,但如果我使用第一种方法,它会尝试使用Derby连接,我知道这一点,因为我会收到下一条错误消息:

org.hibernate.exception.genericjdbception:无法获取JDBC连接

通过堆栈跟踪,我知道这是由此引起的

连接到端口1527上的服务器本地主机时出错,消息连接被拒绝。

我知道这是因为它试图连接到(JavaDB)DerbyDB

我的persistence.xml如下所示:


org.hibernate.ejb.HibernatePersistence
假的

我在阅读,显然我需要指定一个<代码>独立的.xml < /C> >提供一个不同的<代码> <代码>,但它比我应该要复杂一些(我不想追捕错误的兔子),我已经从java EE世界上呆了一段时间,所以我认为我自己是这个新的。(对于假人,解释得到广泛认可)


(如果有帮助)我正在GlassFish 4.1服务器上运行。请询问是否需要任何其他信息。

我认为您的问题与数据库有关,但对于EntityManager,我通常会这样做:

public class EntityManagerFactoryProducer {

        @Produces
        @ApplicationScoped
        public EntityManagerFactory create() {
            return Persistence.createEntityManagerFactory("HibernatePersistanceProv");
        }

        public void destroy(@Disposes EntityManagerFactory factory) {
            factory.close();
        }

    }

    public class EntityManagerProducer {

        @Inject
        private EntityManagerFactory emf;

        @Produces
        @RequestScoped
        public EntityManager create() {
            return emf.createEntityManager();
        }

        public void destroy(@Disposes EntityManager em) {
            em.close();
        }
    }
而不仅仅是简单地将其注入到任何您想要的地方。如果您有更多的数据库,请使用限定符结合注入

@Inject
private EntityManager entityManager;

我认为您的问题与数据库有关,但对于EntityManager,我通常会这样做:

public class EntityManagerFactoryProducer {

        @Produces
        @ApplicationScoped
        public EntityManagerFactory create() {
            return Persistence.createEntityManagerFactory("HibernatePersistanceProv");
        }

        public void destroy(@Disposes EntityManagerFactory factory) {
            factory.close();
        }

    }

    public class EntityManagerProducer {

        @Inject
        private EntityManagerFactory emf;

        @Produces
        @RequestScoped
        public EntityManager create() {
            return emf.createEntityManager();
        }

        public void destroy(@Disposes EntityManager em) {
            em.close();
        }
    }
而不仅仅是简单地将其注入到任何您想要的地方。如果您有更多的数据库,请使用限定符结合注入

@Inject
private EntityManager entityManager;

最终的解决方案是,我没有在Glassfish中正确管理我的连接池,为了实现此行为(至少这是我发现的方式,但我非常确定它们应该更多),您需要:

玻璃鱼侧:

  • 在“常见任务”面板(管理员控制台(Glasfish4)左侧)中,展开JDBC
  • 选择JDBC连接池并单击主(中央)面板顶部的新建按钮,继续为池配置数据库连接
  • 现在,在前面提到的同一JDBC部分(左面板)中,选择JDBC资源(应位于JDBC连接池的正上方)在那里,您可以创建一个新资源,以便使用您选择的名称使用CDI,或者像我一样,只需在jdbc/\uu default连接中配置它(您可以想象,这是Glassfish CDI名称空间提供的默认连接,要选择您的连接池,请单击main(central)上出现的表上的链接jdbc/\u default面板,这将带您进入另一个窗体,您可以使用标记为池名称的下拉列表:来选择新配置的连接池,或您选择的连接池;将其保存在主(中心)面板的左上角
  • 休眠端:

  • persistence.xml
    中,您可以: a) 确保您没有提供任何
    IFF您在jdbc/\uu默认值中配置的) b) 提供JNDI名称(通常是您为JDBC资源提供的名称(如果您创建了一个)或者在默认连接(JDBC/\u default)的情况下,您可以在编辑视图中看到JDNI名称(即:java:comp/DefaultDataSource)。 将其写入persistence.xml中的
    ,它应该会起到作用
  • 很抱歉缺少图形资源,我稍后会尝试添加它们。我希望它适用于您的“匿名读者”


    重要提示我需要切换回Glassfish 4(而不是4.1),因为Glassfish 4.1当前(截至2016年1月)存在一个错误,不允许您创建新的连接池。

    解决方案是我没有正确管理Glassfish中的连接池,以实现此行为(至少这是我发现的方式,但我很确定他们应该更多)你需要:

    玻璃鱼侧:

  • 在“常见任务”面板(管理员控制台(Glasfish4)左侧)中,展开JDBC
  • 选择JDBC连接池并单击主(中央)面板顶部的新建按钮,继续为池配置数据库连接
  • 现在,在前面提到的同一JDBC部分(左面板)中,选择JDBC资源(应位于JDBC连接池的正上方)在那里,您可以创建一个新资源,以便使用您选择的名称使用CDI,或者像我一样,只需在jdbc/\uu default连接中配置它(您可以想象,这是Glassfish CDI名称空间提供的默认连接,要选择您的连接池,请单击main(central)上出现的表上的链接jdbc/\u default面板,这将带您进入另一个窗体,您可以使用标记为池名称的下拉列表:来选择新配置的连接池,或您选择的连接池;将其保存在主(中心)面板的左上角
  • 休眠端:

  • persistence.xml
    中,您可以: a) 确保您没有提供任何
    IFF您在jdbc/\uu默认值中配置的) b) 提供JNDI名称(通常是您为JDBC资源提供的名称