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