1

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

@PersistenceUnit
EntityManagerFactory emf;

我想注入我的休眠EntityManagerFactory

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

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

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

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

通过堆栈跟踪,我知道它是由于这个原因引起的。

Error connecting to server localhost on port 1527 with message Connection refused.

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

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

<?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>

我正在阅读,显然我需要指定 astandalone.xml来提供不同的<jta-data-source>,但它对我来说比它应该的要复杂一些(我不想追逐错误的兔子),我来自 Java EE 世界而所以我认为我的自我是全新的(对于傻瓜解释受到广泛赞赏)。

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

4

2 回答 2

0

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

玻璃鱼侧:

  1. “常见任务”面板(管理员控制台 (Glasfish4) 的左侧)展开JDBC
  2. 选择JDBC Connection Pools并单击主(中央)面板顶部的New按钮,继续为池配置数据库连接。
  3. 现在在前面提到的同一个JDBC部分(左面板)中选择JDBC Resources(应该在JDBC Connection Pools的正上方),您可以创建一个新资源,以便您可以使用您选择的名称或像我一样使用CDI ,只是在jdbc/__default连接中配置它(您可能想象这是 Glassfish CDI名称空间提供的默认连接,要选择您的连接池,请单击主(中央)面板上出现的表上的链接jdbc/__default ,这将带您进入另一种形式,您可以在其中使用标记为池名称的下拉菜单:选择您新配置的连接池,或您选择的连接池;保存它,主(中央)面板的左上角。

休眠端:

  1. 在 中persistence.xml,您可以:a) 确保您没有提供任何<jta-data-source>(您在jdbc/__default中配置的IFF)b) 提供JNDI 名称(通常是您为JDBC 资源提供的名称(如果您创建了一个)或者在默认连接(jdbc/__default)的情况下,您可以在编辑视图中看到 JDNI 名称(即:java:comp/DefaultDataSource)。将其写入您的 persistence.xml 中,它应该可以解决问题。<jta-data-source>

很抱歉缺少图形资源,我稍后会尝试添加它们。我希望它对你“匿名读者”有用

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

于 2016-01-07T05:13:51.783 回答
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
private EntityManager entityManager;
于 2016-01-04T08:38:29.150 回答