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.
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
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.
Code:
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
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