# JPA mit Hibernate - Unable to build EntityManagerFactory



## zomg (27. Mrz 2012)

Hallo,

Ich versuche mich gerade an JPA und benutze dazu Hibernate. Ich habe mich an folgendes Tutorial gehalten: http://schuchert.wikispaces.com/JPA+Tutorial+1+-+Getting+Started

Ich habe folgende Jars in meiner Library (bin mir nicht sicher, ob das komplett ist, da ich teilweise neure Versionen benutze als im Tutorial angegeben):

C:\libs\hibernate-release-4.1.1.Final\lib\required\hibernate-jpa-2.0-api-1.0.1.Final.jar
C:\libs\hibernate-release-4.1.1.Final\lib\required\javassist-3.15.0-GA.jar
C:\libs\hibernate-release-4.1.1.Final\lib\required\antlr-2.7.7.jar
C:\libs\hibernate-release-4.1.1.Final\lib\required\dom4j-1.6.1.jar
C:\libs\hibernate-release-4.1.1.Final\lib\required\hibernate-commons-annotations-4.0.1.Final.jar
C:\libs\hibernate-release-4.1.1.Final\lib\required\hibernate-core-4.1.1.Final.jar
C:\libs\hibernate-release-4.1.1.Final\lib\required\jboss-logging-3.1.0.GA.jar
C:\libs\hibernate-release-4.1.1.Final\lib\required\jboss-transaction-api_1.1_spec-1.0.0.Final.jar
C:\libs\hibernate-release-4.1.1.Final\lib\jpa\hibernate-entitymanager-4.1.1.Final.jar
C:\libs\apache-openejb-4.0.0-beta-2\lib\log4j-1.2.16.jar
C:\libs\apache-openejb-4.0.0-beta-2\lib\javaee-api-6.0-3.jar
C:\libs\hsqldb-2.2.8\hsqldb\lib\hsqldb.jar
C:\libs\slf4j-1.6.4\slf4j-simple-1.6.4.jar
C:\libs\slf4j-1.6.4\slf4j-api-1.6.4.jar


Ich benutze Eclipse 3.7.1 mit Java SE 1.7

Beim ausführen der Test (JUnit) Klasse, wie im Tutorial beschrieben, bekomme ich folgenden Fehler:


```
javax.persistence.PersistenceException: [PersistenceUnit: examplePersistenceUnit] Unable to build EntityManagerFactory
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
	at entity.PersonTest.initEmfAndEm(PersonTest.java:22)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
	at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.HibernateException: Error applying BeanValidation relational constraints
	at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyRelationalConstraints(BeanValidationIntegrator.java:219)
	at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:126)
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:304)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1740)
	at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
	... 29 more
Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.applyRelationalConstraints(BeanValidationIntegrator.java:208)
	... 34 more
Caused by: org.hibernate.HibernateException: Unable to build the default ValidatorFactory
	at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:524)
	at org.hibernate.cfg.beanvalidation.TypeSafeActivator.applyDDL(TypeSafeActivator.java:119)
	... 39 more
Caused by: javax.validation.ValidationException: Could not create Configuration.
	at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:175)
	at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:50)
	at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:521)
	... 40 more
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
	at java.util.ArrayList.rangeCheck(Unknown Source)
	at java.util.ArrayList.get(Unknown Source)
	at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:173)
	... 42 more

java.lang.NullPointerException
	at entity.PersonTest.cleanup(PersonTest.java:29)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:37)
	at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
```


Hier noch meine persistence.xml. Liegt auch wie sie soll in src/META-INF

[XML]<?xml version="1.0" encoding="UTF-8" ?>
<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"
	version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">

    <persistence-unit name="examplePersistenceUnit" 
                      transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider> 
        <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>[/XML]

Ich komme einfach nicht dahinter, wo der Fehler liegt. Würd mich freuen, wenn mir da jemand weiterhelfen könnte.

Gruß,
zomg


----------



## Andgalf (27. Mrz 2012)

Als erstes solltest Du mal deine Klasse PersonTest mitposten ... da ist doch ein Nullpointer in zeile 39


----------



## zomg (27. Mrz 2012)

Ist 1 zu 1 die Klasse aus dem Tutorial:


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

Ist logischerweise in Zeile 29, beim schließen des EntityManager em, da dieser ja im @Before nicht initialisiert wurde, da es ja auch keine EntityManagerFactory erstellt wurde.


----------



## Andgalf (27. Mrz 2012)

Scheinbar hast Du das falsche bean-validation jar im classpath

vll. hilft dir das:

https://community.jboss.org/message/640442

[EDIT] bzw. sehe ich in deiner Aufzählung gar keins[/EDIT]

bzw. das:
https://forum.hibernate.org/viewtopic.php?f=1&t=1014606


----------



## zomg (27. Mrz 2012)

Andgalf hat gesagt.:


> Scheinbar hast Du das falsche bean-validation jar im classpath
> 
> vll. hilft dir das:
> 
> ...




Der OP des von dir verlinkten Thread hat ja aber das Problem: Could not build a default Bean Validator factory

und bei mir ist es ja eine EntityManagerFactory. 
Brauch ich die bean-validation jar den hier überhaupt? Wenn ja, wo bekomme ich die her? Im Hibernate Release 4.1.1 Final war die zumindest (so weit ich das sehe) nicht dabei.


----------



## Andgalf (27. Mrz 2012)

Wenn du deinen Stacktrace genau anschaust findest du das hier

Caused by: org.hibernate.HibernateException: Unable to build the default ValidatorFactory

Der root cause ist bei dir und in dem von mir verlinkten Thread der gleiche.

Hatte in meinem ersten Post auch noch einen weiteren Thread nachträglich verlinkt.


@ Wo bekomme ich das her: Einfach mal googlen sollte leicht zu finden sein


----------



## zomg (27. Mrz 2012)

Alles klar. Werd ich mir morgen auf jeden Fall nochmal angucken und auch nochmal die Dokumentation von Hibernate zu dem Thema durcharbeiten.


----------



## zomg (28. Mrz 2012)

So nach dem ich eine hibernate-validator-4.2.0.Final.jar mit in den Classpath aufgenommen laufen alle JUnit-Test grün. Danke nochmal.


----------

