From d1cf59db5e7577e4ee9ecbd37849762f36a2610e Mon Sep 17 00:00:00 2001
From: Martin Goik <goik@hdm-stuttgart.de>
Date: Tue, 30 Jun 2015 12:38:00 +0200
Subject: [PATCH] Completing JPA exercise version of rdbms2catalog

---
 .../Ref/src/rdbms2catalog.jpa.sksleton.zip    | Bin 0 -> 10107 bytes
 Doc/Sda1/jdbc.xml                             |   2 +-
 Doc/Sda1/jpaintro.xml                         | 115 ++++++++++++++++++
 3 files changed, 116 insertions(+), 1 deletion(-)
 create mode 100644 Doc/Sda1/Ref/src/rdbms2catalog.jpa.sksleton.zip

diff --git a/Doc/Sda1/Ref/src/rdbms2catalog.jpa.sksleton.zip b/Doc/Sda1/Ref/src/rdbms2catalog.jpa.sksleton.zip
new file mode 100644
index 0000000000000000000000000000000000000000..b5d18f792c525ad17a67d58a289beb0be7205051
GIT binary patch
literal 10107
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
Q=mY)e|BH)2e;ok$Kc%<`DF6Tf

literal 0
HcmV?d00001

diff --git a/Doc/Sda1/jdbc.xml b/Doc/Sda1/jdbc.xml
index d4e00ead7..518c4587f 100644
--- a/Doc/Sda1/jdbc.xml
+++ b/Doc/Sda1/jdbc.xml
@@ -3574,7 +3574,7 @@ PersistenceHandler.password=<emphasis role="bold">XYZ</emphasis> <co
         </qandaset>
       </section>
 
-      <section xml:id="sectRelationadatal2Xml">
+      <section xml:id="sda1SectRelationadatal2Xml">
         <title>Reversing <xref linkend="glo_XML"/> to Rdbms</title>
 
         <qandaset defaultlabel="qanda" xml:base="qandaRelationaldata2Xml"
diff --git a/Doc/Sda1/jpaintro.xml b/Doc/Sda1/jpaintro.xml
index 9c7c38d4e..d62b78208 100644
--- a/Doc/Sda1/jpaintro.xml
+++ b/Doc/Sda1/jpaintro.xml
@@ -330,4 +330,119 @@ CREATE TABLE `Lecture` (
       </qandadiv>
     </qandaset>
   </section>
+
+  <section xml:id="sda1SectRdbms2catalogJpa">
+    <title>Exporting <xref linkend="glo_XML"/> catalog data using <xref
+    linkend="glo_JPA"/>.</title>
+
+    <qandaset defaultlabel="qanda" xml:id="sda1QandaRdbms2catalogJpa">
+      <qandadiv>
+        <qandaentry>
+          <question>
+            <para>In <xref linkend="sda1SectRelationadatal2Xml"/> you exported
+            RDBMS data to <xref linkend="glo_XML"/> by means of <xref
+            linkend="glo_JDBC"/>.</para>
+
+            <para>In this exercise we want to facilitate the database reading
+            part by using <xref linkend="glo_JPA"/>. You may follow the
+            subsequently described steps:</para>
+
+            <orderedlist>
+              <listitem>
+                <para>Import the Maven skeleton project <link
+                xlink:href="Ref/src/rdbms2catalog.jpa.sksleton.zip">rdbms2catalog.jpa.sksleton.zip</link>.</para>
+              </listitem>
+
+              <listitem>
+                <para>Add required properties among with <xref
+                linkend="glo_JPA"/> annotations to
+                <classname>de.hdm_stuttgart.mi.sda1.sql2catalog.model.Product</classname>
+                and
+                <classname>de.hdm_stuttgart.mi.sda1.sql2catalog.model.Description</classname>.</para>
+
+                <tip>
+                  <orderedlist>
+                    <listitem>
+                      <para>Since <xref linkend="glo_JPA"/> requires an
+                      <code>@id</code> you must provide it. Though composite
+                      <code>@id</code> are possible you better define an
+                      additional (business) unique constraint by:</para>
+
+                      <programlisting language="none">@Table(
+	    uniqueConstraints=
+	        @UniqueConstraint(columnNames={"product", "orderIndex"})
+	)
+@Entity
+public class Description { ...</programlisting>
+                    </listitem>
+
+                    <listitem>
+                      <para>The required <code>@ManyToOne</code> annotation
+                      will result in a SQL schema property
+                      <property>product_id</property>. This may be renamed to
+                      <property>product</property> by adding
+                      <code>@JoinColumn(name="product")</code>.</para>
+                    </listitem>
+
+                    <listitem>
+                      <para>Adding @OneToMany(mappedBy = "product", <emphasis
+                      role="bold">cascade=CascadeType.ALL</emphasis>) allows
+                      for transitive persistence of dependent
+                      <classname>de.hdm_stuttgart.mi.sda1.sql2catalog.model.Description</classname>
+                      entities.</para>
+                    </listitem>
+                  </orderedlist>
+                </tip>
+
+                <para>A correct implementation should allow for enabling
+                <classname>rdbms2catalog.TestSchema</classname> by
+                uncommenting the test method's body. </para>
+              </listitem>
+
+              <listitem>
+                <para>Write a second <productname>Junit</productname> test
+                class checking for uniqueness of
+                (<property>product</property>,
+                <property>itemOrder</property>). Using duplicates should yield
+                an exception which may be accounted for by using:</para>
+
+                <programlisting language="none">public class TestSchemaConflict {
+...
+	@Test(expected= ...Exception.class)
+	public void insertData() {
+		{
+	          final EntityTransaction transaction = em.getTransaction();
+	          transaction.begin();
+	          
+	          final Product monkeyPickedTea = new Product(1, "Monkey Picked Tea", null);
+	          new Description(monkeyPickedTea, 0, "Picked only by specially trained monkeys");
+	          new Description(monkeyPickedTea, 0, "Rare wild Chinese tea"); // oops! Unique key violation
+...</programlisting>
+              </listitem>
+
+              <listitem>
+                <para>Implement the actual RDBMS to <xref linkend="glo_XML"/>
+                export application.</para>
+
+                <tip>
+                  <para><filename>META-INF/persistence.xml</filename> does
+                  contain a second persistence unit definition
+                  <property>name="none"</property> which does not alter the
+                  database schema. Since your tests already inserted required
+                  test data you may use this alternate configuration for using
+                  your RDBMS as a data source.</para>
+                </tip>
+              </listitem>
+            </orderedlist>
+          </question>
+
+          <answer>
+            <annotation role="make">
+              <para role="eclipse">Sda1/Jpa/rdbms2catalog/solution</para>
+            </annotation>
+          </answer>
+        </qandaentry>
+      </qandadiv>
+    </qandaset>
+  </section>
 </chapter>
-- 
GitLab