Search code examples
javahibernatejpaentitymanagerhibernate-entitymanager

JPA - createEntityManagerFactory returns Null


Noob question here. I'm following this example/tutorial to try and isolate a problem I keep getting on my main project. Problem is, the entityManagerFactory keeps returning null (thus, I get a NullPointerExcept when trying to run the first JUnit test.)

I'm currently on Eclipse Indigo (JavaEE) - JRE7 - Hibernate 3.6.7 and JBoss 7

And here's my persistence.xml (again, a copipasta taken right from the tutorial)

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

Things I've already tried/found out so far:

  • Seems this problem tends to occur if you try to create a factory with a persistence unit that is not listed in the persistence.xml

  • Double-checked that the necessary JARs are included in Eclipse's Build Path Libraries, which Google suggested may be a possible cause for a createEntityManagerFactory() call to short-circuit and return null (instead of just throwing an exception or logging a message)

  • Might be due to a possible error whilst configuring Hibernate connection?

I've been hitting this wall for the past couple of weeks, so it goes without saying that any help/general direction tips are MUCH appreciated :D


Solution

  • Gaston, I have some suggestions/questions for you:

    1 - Is this the code you're trying to execute?

    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() {
        }
    }
    

    If it is, try to comment this line: "Logger.getLogger("org").setLevel(Level.ERROR);". Or change it to "Logger.getLogger("org").setLevel(Level.ALL);". Then you should see the errors on the output console.

    2 - In your persistence.xml I see you're using hsqldb database. Did you installed/configured it properly?

    If you dont't know this database, I suggest you use MySQL, PostgreSQL, or some database you are familiar with.

    3 - Check you persistence.xml. Mine is a little bite different:

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

    Notice the header has some XML declarations that might be important, since Hibernate is telling you that your file is incorrect.