From 9e5b78b712826c3e9d93a860674ff1cae7d9bb0c Mon Sep 17 00:00:00 2001
From: Martin Goik <goik@hdm-stuttgart.de>
Date: Sat, 7 Jan 2017 23:26:44 +0100
Subject: [PATCH] Criteria / metamodel support

---
 .../META-INF/maven/archetype-metadata.xml     |  3 +-
 .../resources/archetype-resources/Readme.md   | 15 +++++
 .../resources/archetype-resources/pom.xml     | 65 +++++++++++++++++--
 .../src/main/java/SearchByIcao.java           | 65 +++++++++++++++++++
 .../src/main/java/model/Airline.java          |  4 ++
 .../main/resources/META-INF/persistence.xml   | 27 ++++++++
 6 files changed, 171 insertions(+), 8 deletions(-)
 create mode 100644 ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/Readme.md
 create mode 100644 ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/java/SearchByIcao.java

diff --git a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/META-INF/maven/archetype-metadata.xml b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/META-INF/maven/archetype-metadata.xml
index ff2b99160..97f0e0d1c 100644
--- a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/META-INF/maven/archetype-metadata.xml
+++ b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -22,9 +22,10 @@
       </includes>
     </fileSet>
     <fileSet encoding="UTF-8">
-      <directory></directory>
+      <directory/>
       <includes>
         <include>.gitignore</include>
+        <include>Readme.md</include>
       </includes>
     </fileSet>
   </fileSets>
diff --git a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/Readme.md b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/Readme.md
new file mode 100644
index 000000000..1341328e0
--- /dev/null
+++ b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/Readme.md
@@ -0,0 +1,15 @@
+JPA 2 project template
+======================
+
+General:
+--------
+Executing »`mvn test`« generates metamodel classes being required for
+criteria based queries.
+
+
+Eclipse users:
+--------------
+You will have to execute »`mvn test`« manually from the command line or by right
+clicking on your project's root choosing »`Run As`« - - > »`Maven test`«. This will
+trigger the metamodel generating process resolving a compile time error in 
+class »`SearchByIcao`«.
\ No newline at end of file
diff --git a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/pom.xml b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/pom.xml
index 0bde95906..69892d78f 100644
--- a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/pom.xml
+++ b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/pom.xml
@@ -19,8 +19,8 @@
 
 		<dependency>
 			<groupId>org.hibernate</groupId>
-			<artifactId>hibernate-entitymanager</artifactId>
-			<version>5.1.0.Final</version>
+			<artifactId>hibernate-core</artifactId>
+			<version>5.2.5.Final</version>
 		</dependency>
 
 		<dependency>
@@ -39,11 +39,11 @@
 		<dependency>
 			<groupId>org.apache.logging.log4j</groupId>
 			<artifactId>log4j-core</artifactId>
-			<version>2.6</version>
+			<version>2.7</version>
 		</dependency>
 
-		<!-- Required for executable jar generation to avoid ClassNotFoundException: com.fasterxml.jackson.core.type.TypeReference
-		  and similar dependency problems. -->
+		<!-- Required for executable jar generation to avoid ClassNotFoundException: 
+			com.fasterxml.jackson.core.type.TypeReference and similar dependency problems. -->
 		<dependency>
 			<groupId>com.fasterxml.jackson.core</groupId>
 			<artifactId>jackson-databind</artifactId>
@@ -58,17 +58,68 @@
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-compiler-plugin</artifactId>
-				<version>3.5.1</version>
+				<version>3.6.0</version>
 				<configuration>
 					<source>1.8</source>
 					<target>1.8</target>
+					<compilerArgument>-proc:none</compilerArgument>
 				</configuration>
 			</plugin>
 
+			<plugin>
+				<groupId>org.bsc.maven</groupId>
+				<artifactId>maven-processor-plugin</artifactId>
+				<version>3.2.0</version>
+
+				<executions>
+					<execution>
+						<id>process</id>
+						<goals>
+							<goal>process</goal>
+						</goals>
+						<phase>generate-sources</phase>
+						<configuration>
+							<outputDirectory>${project.build.directory}/metamodel</outputDirectory>
+							<processors>
+								<processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
+							</processors>
+						</configuration>
+					</execution>
+				</executions>
+				<dependencies>
+					<dependency>
+						<groupId>org.hibernate</groupId>
+						<artifactId>hibernate-jpamodelgen</artifactId>
+						<version>5.2.5.Final</version>
+					</dependency>
+				</dependencies>
+			</plugin>
+
+			<!-- Build helper plugin to add generated sources to classpath -->
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>build-helper-maven-plugin</artifactId>
+				<version>1.12</version>
+				<executions>
+					<execution>
+						<id>add-source</id>
+						<phase>generate-sources</phase>
+						<goals>
+							<goal>add-source</goal>
+						</goals>
+						<configuration>
+							<sources>
+								<source>${project.build.directory}/metamodel</source>
+							</sources>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>2.10.3</version>
+				<version>2.10.4</version>
 				<configuration />
 			</plugin>
 
diff --git a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/java/SearchByIcao.java b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/java/SearchByIcao.java
new file mode 100644
index 000000000..08f4de4e9
--- /dev/null
+++ b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/java/SearchByIcao.java
@@ -0,0 +1,65 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+package ${package};
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+
+import ${package}.model.Airline;
+import ${package}.model.Airline_;
+
+public class SearchByIcao {
+   static final Logger log = LogManager.getLogger(SearchByIcao.class);
+
+   // This refers to a corresponding entry <persistence-unit name="entitytemplatePU_nocreate"> 
+   // in META-INF/persistence.xml
+   static public final String PERSISTENCE_UNIT_NAME = "entitytemplatePU_nocreate";
+   /**
+    * @param args Unused
+    */
+   public static void main( String[] args ) {
+
+
+      final EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
+      final EntityManager em = factory.createEntityManager();
+      final CriteriaBuilder builder = factory.getCriteriaBuilder();
+
+      log.info("Read airlines by icao code");
+      em.getTransaction().begin();
+
+
+      final CriteriaQuery<Airline> criteria = builder.createQuery( Airline.class );
+      final Root<Airline> airlineRoot = criteria.from( Airline.class );
+      criteria.select( airlineRoot );
+
+      // The subsequent line of code requires "mvn test" or equivalent triggering the metamodel generator
+      // when working in Eclipse. You may want to right click on your project root choosing
+      //
+      // "Run As" --> "Maven test".
+      //
+      // This step is being required whenever changes to your model classes in mi.intro.jpastart.model happen.
+
+      criteria.where(builder.equal( airlineRoot.get( Airline_.icaoCode), "DLH" ));
+      final List<Airline> airlines = em.createQuery( criteria ).getResultList();
+      for ( Airline person : airlines ) {
+         System.out.println(person);
+      }
+      em.getTransaction().commit();
+      log.info("Read completed");
+
+      em.close();
+
+      factory.close(); 
+   }
+}
\ No newline at end of file
diff --git a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/java/model/Airline.java b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/java/model/Airline.java
index c2ea4e5f5..1c51dcaa4 100644
--- a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/java/model/Airline.java
+++ b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/java/model/Airline.java
@@ -30,4 +30,8 @@ public class Airline {
    public String getIcaoCode() {
       return icaoCode;
    }
+   @Override
+   public String toString() {
+      return name + " (" + icaoCode + ")";
+   }
 }
diff --git a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/resources/META-INF/persistence.xml b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/resources/META-INF/persistence.xml
index 045f5015d..73e85f068 100644
--- a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/resources/META-INF/persistence.xml
+++ b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/resources/META-INF/persistence.xml
@@ -67,4 +67,31 @@
         </properties>
     </persistence-unit>
     
+    <!-- The subsequent persistence unit won't modify the database's schema 
+        javax.persistence.schema-generation.database.action=none
+        -->
+    <persistence-unit name="entitytemplatePU_nocreate">
+        
+        <exclude-unlisted-classes>false</exclude-unlisted-classes>
+        
+        <properties>
+            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
+            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hdm?useSSL=false"/>
+            <property name="javax.persistence.jdbc.user" value="hdmuser"/>
+            <property name="javax.persistence.jdbc.password" value="XYZ"/>
+            
+            <property
+                name="javax.persistence.schema-generation.database.action"
+                value="none"/>
+            
+            <property name="hibernate.format_sql" value="true"/>
+            <property name="hibernate.use_sql_comments" value="true"/>
+            
+            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
+            
+            <property name="hibernate.archive.autodetection" value="class"/>
+            
+        </properties>
+    </persistence-unit>
+    
 </persistence>
-- 
GitLab