注入hibernate PersistenceUnit

时间:2016-01-04 06:12:55

标签: java hibernate java-ee glassfish glassfish-4.1

使用CDI,如下一段代码所示:

strcat(full_filename, ".png");

我想注入我的休眠src = cvLoadImage(full_filename);

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

@PersistenceUnit
EntityManagerFactory emf;

它的工作方式与预期的一样,但如果我使用第一种方法,它会尝试使用Derby连接我知道这一点,因为我收到了下一条错误消息:

EntityManagerFactory

通过堆栈跟踪,我知道它是由此造成的。

EntityManagerFactory emf = Persistence.createEntityManagerFactory("HibernatePersistanceProv");

我知道这是因为它正在尝试连接到(Java DB)Derby db。

我的persistance.xml看起来像这样:

org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection

我正在阅读,显然我需要指定一个Error connecting to server localhost on port 1527 with message Connection refused.来提供不同的<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="HibernatePersistanceProv" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/aschema"/> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value=""/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="false"/> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/aschema"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> </properties> </persistence-unit> </persistence> ,但它对我来说比它应该更复杂(我不想追错兔子),我已经从Java EE世界呆了一段时间,所以我认为我的自我是一个全新的( for dummies 解释被广泛赞赏)。

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

2 个答案:

答案 0 :(得分:0)

我认为您的问题与数据库有关,但是为了注入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。

@Inject
private EntityManager entityManager;

答案 1 :(得分:0)

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

Glassfish方面:

  1. “常见任务”面板中(管理员控制台左侧(Glasfish4)展开 JDBC
  2. 选择 JDBC连接池,然后单击主(中央)面板顶部的新建按钮,继续配置池的数据库连接。
  3. 现在在前面提到的 JDBC 部分(左侧面板)中选择 JDBC资源(应该在 JDBC连接池之上)可以创建一个新资源,以便您可以使用您选择的名称来使用 CDI 或者像我一样,只需在 jdbc / __默认连接中配置它(如您所愿想象一下这是Glassfish CDI 名称空间提供的默认连接,选择你的连接池点击主要(中央)出现的表格上的链接 jdbc / __ default 面板,它将带您进入另一种形式,您可以使用标记为池名称:的下拉列表来选择新配置的连接池,或者您选择的那个;保存它,左上角的主(中央)小组。
  4. Hibernate方面:

    1. persistence.xml中,您可以: a)确保您没有提供{strong> jdbc / __默认中配置的任何<jta-data-source> IFF ) b)提供 JNDI名称(通常是您为 JDBC资源提供的名称(如果您创建了一个)或者是默认连接( jdbc) / __ default )您可以在编辑视图中看到JDNI名称(即:java:comp / DefaultDataSource)。 将其写入persistence.xml中的<jta-data-source>,它应该可以解决问题。
    2. 很抱歉缺少图形资源,我稍后会尝试添加它们。我希望它适合你“匿名读者”

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