【问题标题】:JPA - createEntityManagerFactory returns NullJPA - createEntityManagerFactory 返回 Null
【发布时间】:2011-10-18 21:17:38
【问题描述】:

这里是菜鸟问题。我正在关注this example/tutorial,试图找出我在主要项目中不断遇到的问题。问题是,entityManagerFactory 不断返回 null(因此,在尝试运行第一个 JUnit 测试时,我得到了 NullPointerExcept。)

我目前正在使用 Eclipse Indigo (JavaEE) - JRE7 - Hibernate 3.6.7 和 JBoss 7

这是我的persistence.xml(同样是从教程中截取的copipasta)

<persistence>
        <persistence-unit name="examplePersistenceUnit" 
                          transaction-type="RESOURCE_LOCAL">
            <properties>
                <property name="hibernate.show_sql" value="false" />
                <property name="hibernate.format_sql" value="false" />

                <property name="hibernate.connection.driver_class" 
                          value="org.hsqldb.jdbcDriver" />
                <property name="hibernate.connection.url" 
                          value="jdbc:hsqldb:mem:mem:aname" />
                <property name="hibernate.connection.username" value="sa" />

                <property name="hibernate.dialect" 
                          value="org.hibernate.dialect.HSQLDialect" />
                <property name="hibernate.hbm2ddl.auto" value="create" />
            </properties>
        </persistence-unit>
    </persistence>

到目前为止我已经尝试/发现的事情:

  • 如果您尝试创建工厂,似乎这个问题tends to occur 具有未在 persistence.xml 中列出的持久性单元

  • 仔细检查了必要的 JAR 是否包含在 Eclipse 的 构建路径库,谷歌建议这可能是一个可能的原因 用于短路并返回的 createEntityManagerFactory() 调用 null(而不是仅仅抛出异常或记录消息)

  • 可能是由于一个可能的错误whilst configuring Hibernate 连接?

过去几周我一直在碰壁,所以不言而喻,任何帮助/一般方向提示都非常感谢:D

【问题讨论】:

    标签: java hibernate jpa entitymanager hibernate-entitymanager


    【解决方案1】:

    加斯顿,我有一些建议/问题要问你:

    1 - 这是您要执行的代码吗?

    package entity;
    
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    
    import org.apache.log4j.BasicConfigurator;
    import org.apache.log4j.Level;
    import org.apache.log4j.Logger;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class PersonTest {
        private EntityManagerFactory emf;
    
        private EntityManager em;
    
        @Before
        public void initEmfAndEm() {
            BasicConfigurator.configure();
            Logger.getLogger("org").setLevel(Level.ERROR);
    
            emf = Persistence.createEntityManagerFactory("examplePersistenceUnit");
            em = emf.createEntityManager();
        }
    
        @After
        public void cleanup() {
            em.close();
        }
    
        @Test
        public void emptyTest() {
        }
    }
    

    如果是,请尝试注释此行:“Logger.getLogger("org").setLevel(Level.ERROR);”。或者将其更改为“Logger.getLogger("org").setLevel(Level.ALL);”。然后您应该会在输出控制台上看到错误。

    2 - 在您的 persistence.xml 中,我看到您正在使用 hsqldb 数据库。您是否正确安装/配置了它?

    如果你不了解这个数据库,我建议你使用 MySQL、PostgreSQL 或其他你熟悉的数据库。

    3 - 检查persistence.xml。我的有点不同:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
        <persistence-unit name="App1PU" transaction-type="RESOURCE_LOCAL">
            <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
            <class>com.entities.User</class>
            <class>com.entities.Group</class>
            <properties>
                <property name="javax.persistence.jdbc.url" value="jdbc:mysql://myIP:3306/mydatabase"/>
                <property name="javax.persistence.jdbc.password" value="secret"/>
                <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
                <property name="javax.persistence.jdbc.user" value="myUser"/>
            </properties>
        </persistence-unit>
    </persistence>
    

    请注意,标头中有一些可能很重要的 XML 声明,因为 Hibernate 会告诉您您的文件不正确。

    【讨论】:

    • 感谢安德烈的回复。不幸的是,我仍然遇到同样的问题(实体管理器返回 Null)。正如建议的那样,我将日志级别更改为 ALL 并切换到 MySQL(这是我应该为我的项目使用的)这是我当前在尝试运行 JUnit 测试时得到的:codeHibernatePersistence 返回:javax。 persistence.PersistenceException:持久性.xml 无效。解析 XML 时出错(第 1 行:第 -1 列):cvc-elt.1:找不到元素“持久性”的声明。code 非常感谢您的宝贵时间。问候,
    • 再次检查我的答案,我更新了第三项,给你一个我工作的persistence.xml的例子。
    • 迟到总比没有好:Dpersistence.xml 文件确实是罪魁祸首。最终听从了安德烈的建议(不久前)。刚回来说谢谢。
    猜你喜欢
    • 2013-06-23
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多