# Maven + JPA + Eclipse + Hibernate



## JPT (8. Feb 2011)

Hallo, 

ich bin gerade dabei, ein sauber konfiguriertes Eclipse Projekt aufzusetzen. 
Leider ist es verdammt schwer die passenden Maven Plugins für diverse Aufgaben zu finden. 

Stand ist folgender: Eclipse 3.6 plus M4E-Plugin 0.10.0. Dieses Plugin wertet die POMs aus, um einerseits im Eclipse die Libs zur Verfügung zu stellen, aber auch um die Klassen zu kompilieren. Kurz, im Eclipse eine lauffähige Umgebung zur Verfügung zu haben. 

Nun ist also in zweifacher Hinsicht die pom.xml der richtige Ort, um die Aufgaben auszuführen, die für JPA notwendig sind. Erstens gehört das zum Build-Prozess mittels Maven und zweitens ist es eben nötig, um das Projekt in Eclipse ausführen zu können. So weit, so sauber. 

Nach ewig langer Recherche habe ich nun folgendes Plugin gefunden: 
[XML]<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>hibernate3-maven-plugin</artifactId>
	<version>2.2</version>
	<executions>
		<execution>
			<phase>process-classes</phase>
			<goals>
				<goal>hbm2ddl</goal>
				<!-- goals sind: hbm2cfgxml, hbmtemplate, help, hbm2ddl, hbm2hbmxml, hbm2doc, hbm2java, hbm2dao -->
			</goals>
			<configuration>
				<hibernate>
					<configurationFile>/src/main/config/hibernate.cfg.xml</configurationFile>
				</hibernate>
				<outputDirectory>
					<hbm2cfgxml>src/main/resources</hbm2cfgxml>
					<hbm2ddl>target/hibernate3/sql</hbm2ddl>
				</outputDirectory>
				<outputFile>file.sql</outputFile>
			</configuration>
		</execution>
	</executions>
</plugin>[/XML]

Wenn das M4E-Plugin nun ein Compile anstösst, kommt folgendes. 


```
Maven Builder: FULL_BUILD requireFullBuild
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] Nothing to compile - all classes are up to date
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] Configuration XML file loaded: file:/D:/files/software/logger/jpa/src/main/resources/hibernate.cfg.xml
[INFO] Configuration XML file loaded: file:/D:/files/software/logger/jpa/src/main/resources/hibernate.cfg.xml
[INFO] No hibernate properties file loaded.
[WARN] 1 errors occurred while performing <hbm2ddl>.
[ERROR] Error #1: java.sql.SQLException: Table already exists: BEISPIEL in statement [create table BEISPIEL]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\files\software\logger\jpa\src\test\resources
```
Damit bin ich aber noch nicht wirklich glücklich.
Ja, er ezeugt eine Tabelle in der HSQL Datenbank. 
Aber er zieht diese Information aus der Hibernate-Mapping-Datei.
Ausserdem vermisse ich den Prozess der sich bei JDO "enhance" nennt. Ist das hier nicht nötig?

Müsste im JPA-Modus evtl ein ganz anderer Prozess angestossen werden? 
Oder muss in Hibernate.cfg oder persistence.xml etwas anderes drinstehen?

[XML]<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
[...]
		<property name="show_sql">true</property>
		<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<mapping resource="mapping.hbm.xml"/>
	</session-factory>
</hibernate-configuration>
[/XML]

Wenn ich den Mapping-Eintrag entferne, macht er nichts mehr, obwohl die Klasse ja im persistence.xml eingetragen ist.
[XML]<persistence [namespace definitions]>
	<persistence-unit name="test">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>package.Beispiel</class>
		<properties>
			<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
[weitere JDBC config]
			<property name="hibernate.hbm2ddl.auto" value="update"/>
		</properties>
	</persistence-unit>
</persistence>[/XML]

Wo ist der Fehler? 

danke, 

Jan


----------



## mdoninger (1. Apr 2011)

Ich glaube, du bringst hier zwei unterschiedliche Dinge durcheinander. Wenn du JPA benutzen willst, und Hibernate als JPA-Implementierung, dann brauchst du keine hibernate.cfg.xml mehr, denn die Konfiguration findet komplett in der persistence.xml und orm.xml statt. Außerdem musst du im Quellcode den EntityManager benutzen, und nicht mehr die Hibernate-Sessionfactory.
Wenn du JPA benutzt, und in der persistence.xml die Klasse angibst, dann erwartet soweit ich weiß JPA in der Klasse die passenden Annotations für das Mapping, ansonsten müsste das in der orm.xml definiert werden.


----------

