From 2cb8b3bec5a6bd407811b75873e4bd6526df5c72 Mon Sep 17 00:00:00 2001
From: Martin Goik <goik@hdm-stuttgart.de>
Date: Sun, 25 Dec 2016 12:25:24 +0100
Subject: [PATCH] MongoDB + JPA Exercise

---
 Doc/Common/glossary.xml                       | 30 +++++++
 Doc/Sda1/jpaintro.xml                         |  2 +-
 Doc/Sda1/mongodb.xml                          | 49 -----------
 Doc/lectures.xml                              |  1 +
 P/Sda1/Jpa/OgmUniversity/.gitignore           |  5 ++
 P/Sda1/Jpa/OgmUniversity/pom.xml              | 83 +++++++++++++++++++
 .../mi/sda1/hiberjpa/PersistDriver.java       | 34 ++++++++
 .../mi/sda1/hiberjpa/model/Lecture.java       | 47 +++++++++++
 .../main/resources/META-INF/persistence.xml   | 38 +++++++++
 .../src/main/resources/log4j2.xml             | 21 +++++
 .../mi/sda1/hiberjpa/AppTest.java             | 17 ++++
 11 files changed, 277 insertions(+), 50 deletions(-)
 delete mode 100644 Doc/Sda1/mongodb.xml
 create mode 100644 P/Sda1/Jpa/OgmUniversity/.gitignore
 create mode 100644 P/Sda1/Jpa/OgmUniversity/pom.xml
 create mode 100644 P/Sda1/Jpa/OgmUniversity/src/main/java/de/hdm_stuttgart/mi/sda1/hiberjpa/PersistDriver.java
 create mode 100644 P/Sda1/Jpa/OgmUniversity/src/main/java/de/hdm_stuttgart/mi/sda1/hiberjpa/model/Lecture.java
 create mode 100644 P/Sda1/Jpa/OgmUniversity/src/main/resources/META-INF/persistence.xml
 create mode 100644 P/Sda1/Jpa/OgmUniversity/src/main/resources/log4j2.xml
 create mode 100644 P/Sda1/Jpa/OgmUniversity/src/test/java/de/hdm_stuttgart/mi/sda1/hiberjpa/AppTest.java

diff --git a/Doc/Common/glossary.xml b/Doc/Common/glossary.xml
index 6b945b6fb..fb3e2c014 100644
--- a/Doc/Common/glossary.xml
+++ b/Doc/Common/glossary.xml
@@ -45,6 +45,18 @@
       </glossdef>
     </glossentry>
 
+    <glossentry xml:id="glo_CRUD">
+      <glossterm>CRUD</glossterm>
+
+      <glossdef>
+        <para><link
+        xlink:href="https://en.wikipedia.org/wiki/Create,_read,_update_and_delete"><emphasis
+        role="bold">C</emphasis>reate, <emphasis role="bold">R</emphasis>ead,
+        <emphasis role="bold">U</emphasis>pdate and <emphasis
+        role="bold">D</emphasis>elete operations</link> </para>
+      </glossdef>
+    </glossentry>
+
     <glossentry xml:id="glo_CSS">
       <glossterm><acronym>CSS</acronym></glossterm>
 
@@ -440,6 +452,24 @@
       </glossdef>
     </glossentry>
 
+    <glossentry xml:id="glo_MongoDB">
+      <glossterm>MongoDB</glossterm>
+
+      <glossdef>
+        <glosslist>
+          <glossentry xml:id="glo_Mongo_Shell">
+            <glossterm>Mongo Shell</glossterm>
+
+            <glossdef>
+              <para>Database <link
+              xlink:href="https://docs.mongodb.com/getting-started/shell/client">command
+              line client</link></para>
+            </glossdef>
+          </glossentry>
+        </glosslist>
+      </glossdef>
+    </glossentry>
+
     <glossentry xml:id="glo_ORM">
       <glossterm><acronym>ORM</acronym></glossterm>
 
diff --git a/Doc/Sda1/jpaintro.xml b/Doc/Sda1/jpaintro.xml
index 3cb00f153..847090246 100644
--- a/Doc/Sda1/jpaintro.xml
+++ b/Doc/Sda1/jpaintro.xml
@@ -9,7 +9,7 @@
          xmlns:db="http://docbook.org/ns/docbook">
   <title>Getting started with <xref linkend="glo_JPA"/></title>
 
-  <section xml:id="sda1JpaLecture">
+  <section xml:id="sda1SectJpaLecture">
     <title>Persisting lecture instances</title>
 
     <qandaset defaultlabel="qanda" xml:id="sda1QandaLectureAddBusinessKey">
diff --git a/Doc/Sda1/mongodb.xml b/Doc/Sda1/mongodb.xml
deleted file mode 100644
index 06e8f90f3..000000000
--- a/Doc/Sda1/mongodb.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter version="5.0" xml:id="sda1ChapMongoDB"
-         xmlns="http://docbook.org/ns/docbook"
-         xmlns:xlink="http://www.w3.org/1999/xlink"
-         xmlns:xi="http://www.w3.org/2001/XInclude"
-         xmlns:svg="http://www.w3.org/2000/svg"
-         xmlns:m="http://www.w3.org/1998/Math/MathML"
-         xmlns:html="http://www.w3.org/1999/xhtml"
-         xmlns:db="http://docbook.org/ns/docbook">
-  <title><productname>MongoDB</productname></title>
-
-  <section xml:id="sd1SectMongodbPrerequisite">
-    <title>Prerequisites</title>
-
-    <para><xref linkend="glo_Ubuntu"/> installation instructions are on offer
-    from <uri
-    xlink:href="https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/#run-mongodb-community-edition">https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu</uri>.</para>
-
-    <para>Follow <uri
-    xlink:href="https://docs.mongodb.com/getting-started/shell/introduction">https://docs.mongodb.com/getting-started/shell/introduction</uri>
-    populating your database with sample data. Insert, retrieve, update and
-    delete sample data like e.g.:</para>
-
-    <programlisting language="json">db.courses.insert(
-   {
-      "lecture" : {
-         "title" : "Introduction to JSON",
-         "required" : "10075",
-         "prerequisites" : "XXX"
-      },
-      "studyCourse" : "MIB",
-      "programme" : "Bachelor",
-      "recommendedSemesters" : [
-         {
-            "semester" : [3],
-            "comment" : "before doing practical stuff"
-         },
-         {
-            "semester" : [5,6,7],
-            "comment" : "After doing practical stuff"
-         }
-      ],
-      "lecture_id" : 113213
-   }
-)</programlisting>
-  </section>
-
-  <xi:include href="../Common/glossary.xml" xpointer="element(/1)"/>
-</chapter>
diff --git a/Doc/lectures.xml b/Doc/lectures.xml
index a5d1735fd..1385f21f6 100644
--- a/Doc/lectures.xml
+++ b/Doc/lectures.xml
@@ -173,6 +173,7 @@
     <xi:include href="Sda1/jdbc.xml" xpointer="element(/1)"/>
 
     <xi:include href="Sda1/jpaintro.xml" xpointer="element(/1)"/>
+    <xi:include href="Sda1/mongodb.xml" xpointer="element(/1)"/>
 
     <appendix>
       <title>Appendix</title>
diff --git a/P/Sda1/Jpa/OgmUniversity/.gitignore b/P/Sda1/Jpa/OgmUniversity/.gitignore
new file mode 100644
index 000000000..791f189b0
--- /dev/null
+++ b/P/Sda1/Jpa/OgmUniversity/.gitignore
@@ -0,0 +1,5 @@
+/target/
+/.settings/
+.classpath
+.project
+/A1.log
diff --git a/P/Sda1/Jpa/OgmUniversity/pom.xml b/P/Sda1/Jpa/OgmUniversity/pom.xml
new file mode 100644
index 000000000..c2ca2eac0
--- /dev/null
+++ b/P/Sda1/Jpa/OgmUniversity/pom.xml
@@ -0,0 +1,83 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>de.hdm-stuttgart.mi.sda1</groupId>
+	<artifactId>ogm-university</artifactId>
+	<version>0.1</version>
+	<packaging>jar</packaging>
+
+	<name>Ogm-university</name>
+
+	<url>http://www.mi.hdm-stuttgart.de/freedocs</url>
+
+	<dependencies>
+
+		<dependency>
+			<groupId>org.hibernate.ogm</groupId>
+			<artifactId>hibernate-ogm-mongodb</artifactId>
+			<version>5.1.0.Beta1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.hibernate.javax.persistence</groupId>
+			<artifactId>hibernate-jpa-2.1-api</artifactId>
+			<version>1.0.0.Final</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.jboss.spec.javax.transaction</groupId>
+			<artifactId>jboss-transaction-api_1.2_spec</artifactId>
+			<version>1.0.1.Final</version>
+		</dependency>
+
+		<!-- Add the Narayana Transactions Manager an implementation would be provided 
+			in a Java EE container, but this works nicely in Java SE as well -->
+		<dependency>
+			<groupId>org.jboss.narayana.jta</groupId>
+			<artifactId>narayana-jta</artifactId>
+			<version>5.5.0.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>org.jboss</groupId>
+			<artifactId>jboss-transaction-spi</artifactId>
+			<version>7.5.0.Final</version>
+		</dependency>
+
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+                        <version>6.0.5</version>
+		</dependency>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-core</artifactId>
+			<version>2.6</version>
+		</dependency>
+
+	</dependencies>
+
+	<build>
+		<plugins>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.5.1</version>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
+			</plugin>
+
+		</plugins>
+	</build>
+</project>
diff --git a/P/Sda1/Jpa/OgmUniversity/src/main/java/de/hdm_stuttgart/mi/sda1/hiberjpa/PersistDriver.java b/P/Sda1/Jpa/OgmUniversity/src/main/java/de/hdm_stuttgart/mi/sda1/hiberjpa/PersistDriver.java
new file mode 100644
index 000000000..fd1a35846
--- /dev/null
+++ b/P/Sda1/Jpa/OgmUniversity/src/main/java/de/hdm_stuttgart/mi/sda1/hiberjpa/PersistDriver.java
@@ -0,0 +1,34 @@
+package de.hdm_stuttgart.mi.sda1.hiberjpa;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import de.hdm_stuttgart.mi.sda1.hiberjpa.model.Lecture;
+
+/**
+ * A simple OGM example
+ * 
+ */
+public class PersistDriver {
+
+   /**
+    * @param args Unused
+    */
+   public static void main(String[] args) {
+      final EntityManagerFactory emFactory = Persistence
+            .createEntityManagerFactory("ogm-mongodb");
+
+      final EntityManager em = emFactory.createEntityManager();
+
+      em.getTransaction().begin();
+      {
+         em.persist(new Lecture("Structure data and applications 1"));
+      }
+      em.getTransaction().commit();
+
+      em.close();
+
+      emFactory.close();
+   }
+}
diff --git a/P/Sda1/Jpa/OgmUniversity/src/main/java/de/hdm_stuttgart/mi/sda1/hiberjpa/model/Lecture.java b/P/Sda1/Jpa/OgmUniversity/src/main/java/de/hdm_stuttgart/mi/sda1/hiberjpa/model/Lecture.java
new file mode 100644
index 000000000..21e1a2686
--- /dev/null
+++ b/P/Sda1/Jpa/OgmUniversity/src/main/java/de/hdm_stuttgart/mi/sda1/hiberjpa/model/Lecture.java
@@ -0,0 +1,47 @@
+package de.hdm_stuttgart.mi.sda1.hiberjpa.model;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.TableGenerator;
+
+/**
+ * A simple example entity
+ *
+ */
+@Entity
+public class Lecture {
+
+	@Id
+	@GeneratedValue (strategy = GenerationType.TABLE, generator = "lecture")
+
+	@TableGenerator(
+			name = "lecture",
+			table = "sequences",
+			pkColumnName = "key",
+			pkColumnValue = "lecture",
+			valueColumnName = "seed"
+			)
+	private Integer id;
+
+	String name;
+
+	protected Lecture (){}
+
+	public Lecture (final String name){
+		setName(name);
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+}
diff --git a/P/Sda1/Jpa/OgmUniversity/src/main/resources/META-INF/persistence.xml b/P/Sda1/Jpa/OgmUniversity/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 000000000..10c234805
--- /dev/null
+++ b/P/Sda1/Jpa/OgmUniversity/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,38 @@
+<persistence
+	version="2.1"
+	xmlns="http://xmlns.jcp.org/xml/ns/persistence"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
+	http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
+	
+	<persistence-unit name="ogm-mongodb" transaction-type="RESOURCE_LOCAL"> <!-- transaction-type="JTA" -->
+		<provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
+		<exclude-unlisted-classes>false</exclude-unlisted-classes>
+		<properties>
+			<property name="hibernate.ogm.datastore.provider" value="mongodb" />
+			<property name="hibernate.ogm.datastore.database" value="catalog" />
+			<property name="hibernate.ogm.datastore.create_database" value="true" />
+		</properties>
+	</persistence-unit>
+</persistence>
+	
+	<!-- 
+	<persistence-unit name="jpa-recreate">
+		
+		<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="drop-and-create"/>
+			<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>
+    -->
diff --git a/P/Sda1/Jpa/OgmUniversity/src/main/resources/log4j2.xml b/P/Sda1/Jpa/OgmUniversity/src/main/resources/log4j2.xml
new file mode 100644
index 000000000..a387d6f7c
--- /dev/null
+++ b/P/Sda1/Jpa/OgmUniversity/src/main/resources/log4j2.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <File name="A1" fileName="A1.log" append="false">
+            <PatternLayout pattern="%t %-5p %c{2} - %m%n"/>
+        </File>
+        <Console name="STDOUT" target="SYSTEM_OUT">
+            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+
+        <!-- You my want to define class or package level per-logger rules -->
+        <Logger name="de.hdm_stuttgart.mi.sda1.hiberjpa.App" level="debug">
+            <AppenderRef ref="A1"/>
+        </Logger>
+        <Root level="info">
+            <AppenderRef ref="STDOUT"/>
+        </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/P/Sda1/Jpa/OgmUniversity/src/test/java/de/hdm_stuttgart/mi/sda1/hiberjpa/AppTest.java b/P/Sda1/Jpa/OgmUniversity/src/test/java/de/hdm_stuttgart/mi/sda1/hiberjpa/AppTest.java
new file mode 100644
index 000000000..1eac334a0
--- /dev/null
+++ b/P/Sda1/Jpa/OgmUniversity/src/test/java/de/hdm_stuttgart/mi/sda1/hiberjpa/AppTest.java
@@ -0,0 +1,17 @@
+package de.hdm_stuttgart.mi.sda1.hiberjpa;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest {
+    /**
+     * Dummy test method
+     */
+    @Test
+    public void testApp() {
+        Assert.assertTrue( true );
+    }
+}
-- 
GitLab