通过使用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。

我的persistance.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>


我正在阅读,显然我需要指定一个standalone.xml来提供一个不同的<jta-data-source>,但它对我来说比它应该显示的要复杂一些(我不想追逐错误的兔子),我来自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();
        }
    }


比只是将其注入您想要的任何位置。如果您有更多的数据库,请结合使用qualifier和ject。

@Inject
private EntityManager entityManager;

10-07 19:11
查看更多