有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java注入hibernate持久化单元

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

@PersistenceUnit
EntityManagerFactory emf;

我想注射我的hibernateEntityManagerFactory

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

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.

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

我的坚持。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世界开始了一段时间,所以我认为我自己是一个全新的人(傻瓜> EME>解释被广泛理解)。p>

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


共 (2) 个答案

  1. # 1 楼答案

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

    玻璃鱼侧:

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

    休眠端:

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

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

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

  2. # 2 楼答案

    我认为您的问题与数据库有关,但对于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;