From 7d48e1228bb06b49439fbcaa895b2b58954adb46 Mon Sep 17 00:00:00 2001 From: Martin Goik <goik@hdm-stuttgart.de> Date: Thu, 12 Jan 2017 16:23:40 +0100 Subject: [PATCH] Correcting JPA rdbms2catalog export exercise --- .../Ref/src/rdbms2catalog.jpa.skeleton.zip | Bin 12854 -> 0 bytes Doc/Sda1/jdbc.xml | 68 +++++++++++++----- Doc/Sda1/jpaintro.xml | 50 ++++++++----- P/Sda1/Jpa/rdbms2catalog/skeleton/pom.xml | 16 ++--- .../sda1/sql2catalog/model/Description.java | 3 - .../main/resources/META-INF/persistence.xml | 60 +++++++++------- .../test/java/rdbms2catalog/TestSchema.java | 3 +- P/Sda1/Jpa/rdbms2catalog/solution/pom.xml | 5 +- .../mi/sda1/sql2catalog/RdbmsAccess.java | 36 ++++++---- .../sda1/sql2catalog/model/Description.java | 3 +- .../main/resources/META-INF/persistence.xml | 58 ++++++++------- .../test/java/rdbms2catalog/TestSchema.java | 12 ++-- 12 files changed, 191 insertions(+), 123 deletions(-) delete mode 100644 Doc/Sda1/Ref/src/rdbms2catalog.jpa.skeleton.zip diff --git a/Doc/Sda1/Ref/src/rdbms2catalog.jpa.skeleton.zip b/Doc/Sda1/Ref/src/rdbms2catalog.jpa.skeleton.zip deleted file mode 100644 index 50ae5f1b69797913c10a10bec021afac30693d9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12854 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 N5F55^NB8a5{{dct+uQ&E diff --git a/Doc/Sda1/jdbc.xml b/Doc/Sda1/jdbc.xml index 7b29a0c37..517e205e4 100644 --- a/Doc/Sda1/jdbc.xml +++ b/Doc/Sda1/jdbc.xml @@ -3532,42 +3532,76 @@ CREATE TABLE Description ( -- A single product lacking age property -- INSERT INTO Product (id, name) VALUES (1, 'Monkey Picked Tea'); -INSERT INTO Description VALUES(1, 0, 'Picked only by specially trained monkeys'); -INSERT INTO Description VALUES(1, 1, 'Rare wild Chinese tea'); +INSERT INTO Description VALUES(1, 0, 'Picked only by specially trained monkeys.'); +INSERT INTO Description VALUES(1, 1, 'Rare wild Chinese tea.'); INSERT INTO Product VALUES (2, '4-Person Instant Tent', 15); INSERT INTO Description VALUES(2, 0, 'Exclusive WeatherTec system.'); -INSERT INTO Description VALUES(2, 1, '4-person, 1-compartment tent'); -INSERT INTO Description VALUES(2, 2, 'Pre-attached tent poles');</programlisting> +INSERT INTO Description VALUES(2, 1, '4-person, 1-compartment tent.'); +INSERT INTO Description VALUES(2, 2, 'Pre-attached tent poles.');</programlisting> - <para>Write a <xref linkend="glo_JDBC"/> application which - reads from your RDBMS data and exports a corresponding <xref - linkend="glo_XML"/> instance:</para> + <orderedlist> + <listitem> + <para>Explain the ratio of the <code>UNIQUE(product, + orderIndex)</code> constraint in + <classname>Description</classname>.</para> + </listitem> + + <listitem> + <para>Write a <xref linkend="glo_JDBC"/> application which + reads from your RDBMS data and exports a corresponding + <xref linkend="glo_XML"/> instance:</para> - <programlisting language="xml"><catalog> + <programlisting language="xml"><catalog> <product id="1"> <name>Monkey Picked Tea</name> <description>Picked only by specially trained monkeys</description> - <description>Rare wild Chinese tea</description> + <description>Rare wild Chinese tea.</description> </product> <product id="2"> <name>4-Person Instant Tent</name> <description>Exclusive WeatherTec system.</description> - <description>4-person, 1-compartment tent</description> - <description>Pre-attached tent poles</description> + <description>4-person, 1-compartment tent.</description> + <description>Pre-attached tent poles.</description> <age>15</age> </product> </catalog></programlisting> - <para>Use <link - xlink:href="https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html">PreparedStatement</link> - instances throughout your application.</para> + <para>Use <link + xlink:href="https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html">PreparedStatement</link> + instances throughout your application.</para> + </listitem> + </orderedlist> </question> <answer> - <annotation role="make"> - <para role="eclipse">Sda1/rdbms2catalog</para> - </annotation> + <orderedlist> + <listitem> + <para>Without <code>UNIQUE(product, orderIndex)</code> the + following state would become possible:</para> + + <programlisting language="none">+---------+------------------------------+------------+ +| product | text | orderIndex | ++---------+------------------------------+------------+ +| ... | ... | ... | +| 2 | Exclusive WeatherTec system. | 1 | +| 2 | 4-person, 1-compartment tent.| 1 | +| ... | ... | ... | ++---------+------------------------------+------------+</programlisting> + + <para>The presence of two distinct descriptions having + identical orderIndex does not enforce the required + order.</para> + </listitem> + + <listitem> + <para>See:</para> + + <annotation role="make"> + <para role="eclipse">Sda1/rdbms2catalog</para> + </annotation> + </listitem> + </orderedlist> </answer> </qandaentry> </qandadiv> diff --git a/Doc/Sda1/jpaintro.xml b/Doc/Sda1/jpaintro.xml index d75b1fed3..12bf9e209 100644 --- a/Doc/Sda1/jpaintro.xml +++ b/Doc/Sda1/jpaintro.xml @@ -326,16 +326,18 @@ TRACE [main] sql.BasicBinder (BasicBinder.java:65) - binding parameter [1] as [V <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> + linkend="glo_JDBC"/>. In this follow up exercise <xref + linkend="glo_JPA"/> will be used facilitating the database reading + part following:</para> <orderedlist> <listitem> - <para>Import the Maven skeleton project <link - xlink:href="/Sda1/Ref/src/rdbms2catalog.jpa.skeleton.zip">rdbms2catalog.jpa.skeleton.zip</link>.</para> + <para>Import the following (standalone) Maven skeleton project + into your workspace:</para> + + <annotation role="make"> + <para role="eclipse">Sda1/Jpa/rdbms2catalog/skeleton</para> + </annotation> </listitem> <listitem> @@ -348,17 +350,30 @@ TRACE [main] sql.BasicBinder (BasicBinder.java:65) - binding parameter [1] as [V <tip> <para>Since <classname>Description</classname> instances are composites with respect to <classname>Product</classname> - you might want to use <interfacename + (Composition rather than aggregation or association) you + might want to use <interfacename xlink:href="https://en.wikibooks.org/wiki/Java_Persistence/ElementCollection">@ElementCollection</interfacename> in favour of <interfacename xlink:href="https://en.wikibooks.org/wiki/Java_Persistence/ManyToOne">@ManyToOne</interfacename> - / <interfacename + and <interfacename xlink:href="https://en.wikibooks.org/wiki/Java_Persistence/OneToMany">@OneToMany</interfacename>.</para> </tip> - <para>Test your implementation by uncommenting the test - method's body in - <classname>rdbms2catalog.TestSchema</classname>.</para> + <tip> + <para>Regarding ordering of descriptions you may want to + read <interfacename + xlink:href="http://docs.oracle.com/javaee/7/api/javax/persistence/OrderColumn.html">@OrderColumn</interfacename>'s + documentation.</para> + </tip> + </listitem> + + <listitem> + <para>The <xref linkend="glo_Junit"/> test class + <classname>rdbms2catalog.TestSchema</classname> does contain + <xref linkend="glo_JPA"/> data inserting code being commented + out. Having your data model completed you may uncomment these. + Test execution will then populate your database with sample + data.</para> </listitem> <listitem> @@ -367,11 +382,12 @@ TRACE [main] sql.BasicBinder (BasicBinder.java:65) - binding parameter [1] as [V <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> + contain a second persistence unit + <quote>strategy_none</quote> which does not alter the + database schema. Since your tests already created a schema + and inserted required test data you may use this alternate + configuration for reading from your RDBMS data + source.</para> </tip> </listitem> </orderedlist> diff --git a/P/Sda1/Jpa/rdbms2catalog/skeleton/pom.xml b/P/Sda1/Jpa/rdbms2catalog/skeleton/pom.xml index b8bb6115c..0be8114f2 100644 --- a/P/Sda1/Jpa/rdbms2catalog/skeleton/pom.xml +++ b/P/Sda1/Jpa/rdbms2catalog/skeleton/pom.xml @@ -2,15 +2,8 @@ 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> - <parent> - <groupId>de.hdm-stuttgart.mi</groupId> - <artifactId>lecturenotes-pom</artifactId> - <version>1.0</version> - <relativePath>../../../../pom.xml</relativePath> - </parent> - <groupId>de.hdm-stuttgart.mi.sda1</groupId> - <artifactId>rdbms2catalog</artifactId> + <artifactId>rdbms2catalog-skeleton</artifactId> <version>0.9</version> <packaging>jar</packaging> @@ -28,6 +21,7 @@ <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> + <version>5.1.39</version> </dependency> <dependency> @@ -54,7 +48,7 @@ <dependency> <groupId>org.jdom</groupId> <artifactId>jdom2</artifactId> - <version>${org.jdom.jdom2.version}</version> + <version>2.0.6</version> </dependency> </dependencies> @@ -139,7 +133,7 @@ <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> - <Main-Class>jpaintro.university.CreateEntity</Main-Class> + <Main-Class>de.hdm_stuttgart.mi.sda1.sql2catalog.Rdbms2Xml</Main-Class> </manifestEntries> </transformer> </transformers> @@ -156,4 +150,4 @@ </plugins> </build> -</project> +</project> \ No newline at end of file diff --git a/P/Sda1/Jpa/rdbms2catalog/skeleton/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Description.java b/P/Sda1/Jpa/rdbms2catalog/skeleton/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Description.java index 4f3187ef4..753fe59db 100644 --- a/P/Sda1/Jpa/rdbms2catalog/skeleton/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Description.java +++ b/P/Sda1/Jpa/rdbms2catalog/skeleton/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Description.java @@ -8,8 +8,5 @@ import javax.persistence.Id; public class Description { @Id - @GeneratedValue Long id; - - } diff --git a/P/Sda1/Jpa/rdbms2catalog/skeleton/src/main/resources/META-INF/persistence.xml b/P/Sda1/Jpa/rdbms2catalog/skeleton/src/main/resources/META-INF/persistence.xml index 99110e6f4..964be2ed9 100644 --- a/P/Sda1/Jpa/rdbms2catalog/skeleton/src/main/resources/META-INF/persistence.xml +++ b/P/Sda1/Jpa/rdbms2catalog/skeleton/src/main/resources/META-INF/persistence.xml @@ -1,54 +1,62 @@ -<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" +<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" - version="2.1"> + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence + http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> - <persistence-unit name="drop-create" transaction-type="RESOURCE_LOCAL"> + <persistence-unit name = "strategy_drop-and-create"> <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"/> + <!-- + JDBC database connection parameter + --> + + <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" + 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.show_sql" value = "true" /> + <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.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> - <property name="hibernate.archive.autodetection" value="class"/> + <property name = "hibernate.archive.autodetection" value="class"/> </properties> </persistence-unit> - <persistence-unit name="update" transaction-type="RESOURCE_LOCAL"> + <persistence-unit name = "strategy_none"> + <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.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="update"/> + 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.show_sql" value = "true" /> + <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.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> - <property name="hibernate.archive.autodetection" value="class"/> + <property name = "hibernate.archive.autodetection" value="class"/> </properties> </persistence-unit> -</persistence> \ No newline at end of file +</persistence> diff --git a/P/Sda1/Jpa/rdbms2catalog/skeleton/src/test/java/rdbms2catalog/TestSchema.java b/P/Sda1/Jpa/rdbms2catalog/skeleton/src/test/java/rdbms2catalog/TestSchema.java index c1ee75539..8066bc23e 100644 --- a/P/Sda1/Jpa/rdbms2catalog/skeleton/src/test/java/rdbms2catalog/TestSchema.java +++ b/P/Sda1/Jpa/rdbms2catalog/skeleton/src/test/java/rdbms2catalog/TestSchema.java @@ -12,7 +12,7 @@ public class TestSchema { static final EntityManager em; static { - final EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("drop-create"); + final EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("strategy_drop-and-create"); em = emFactory.createEntityManager(); } @@ -36,6 +36,7 @@ public class TestSchema { // instantTent.getDescriptions().add(new Description("Pre-attached tent poles")); transaction.commit(); + em.close(); em.getEntityManagerFactory().close(); } } diff --git a/P/Sda1/Jpa/rdbms2catalog/solution/pom.xml b/P/Sda1/Jpa/rdbms2catalog/solution/pom.xml index ede66d9b8..c674df304 100644 --- a/P/Sda1/Jpa/rdbms2catalog/solution/pom.xml +++ b/P/Sda1/Jpa/rdbms2catalog/solution/pom.xml @@ -18,7 +18,6 @@ <name>rdbms2catalogJpa</name> <url>http://www.mi.hdm-stuttgart.de/freedocs</url> - <dependencies> <dependency> @@ -141,7 +140,7 @@ <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> - <Main-Class>jpaintro.university.CreateEntity</Main-Class> + <Main-Class>de.hdm_stuttgart.mi.sda1.sql2catalog.Rdbms2Xml</Main-Class> </manifestEntries> </transformer> </transformers> @@ -158,4 +157,4 @@ </plugins> </build> -</project> +</project> \ No newline at end of file diff --git a/P/Sda1/Jpa/rdbms2catalog/solution/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/RdbmsAccess.java b/P/Sda1/Jpa/rdbms2catalog/solution/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/RdbmsAccess.java index 11c0a0394..a4b3d6321 100644 --- a/P/Sda1/Jpa/rdbms2catalog/solution/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/RdbmsAccess.java +++ b/P/Sda1/Jpa/rdbms2catalog/solution/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/RdbmsAccess.java @@ -4,6 +4,7 @@ import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; +import javax.persistence.criteria.CriteriaQuery; import org.jdom2.Element; @@ -15,10 +16,11 @@ import de.hdm_stuttgart.mi.sda1.sql2catalog.model.Product; */ public class RdbmsAccess { + static final EntityManagerFactory emFactory; static final EntityManager em; static { - final EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("update"); + emFactory = Persistence.createEntityManagerFactory("strategy_none"); em = emFactory.createEntityManager(); } @@ -27,26 +29,32 @@ public class RdbmsAccess { * @param root */ public void appendProducts(final Element root) { + + final CriteriaQuery<Product> criteria = emFactory.getCriteriaBuilder().createQuery(Product.class); + criteria.from(Product.class); + final EntityTransaction transaction = em.getTransaction(); - transaction.begin(); + transaction.begin();{ + + for (final Product p: em.createQuery(criteria).getResultList()) { - for (final Product p: em.createQuery("SELECT p FROM Product p", Product.class).getResultList()) { + final Element productElement = new Element("product"); + root.addContent(productElement); + productElement.setAttribute("id", "" + p.getId()); - final Element productElement = new Element("product"); - root.addContent(productElement); - productElement.setAttribute("id", "" + p.getId()); - - System.out.println(p.getName() + "++++++++++++++++++++++++++++++++++++"); + System.out.println(p.getName() + "++++++++++++++++++++++++++++++++++++"); - productElement.addContent(new Element("name").addContent(p.getName())); + productElement.addContent(new Element("name").addContent(p.getName())); - p.getDescriptions().stream().forEach(description -> { - productElement.addContent(new Element("description").addContent(description.getDescription())); - }); + p.getDescriptions().stream().forEach(description -> { + productElement.addContent(new Element("description").addContent(description.getDescription())); + }); - p.getAge().ifPresent(age -> productElement.addContent(new Element("age").addContent(age.toString()))); + p.getAge().ifPresent(age -> productElement.addContent(new Element("age").addContent(age.toString()))); + } } transaction.commit(); - em.getEntityManagerFactory().close(); + em.close(); + emFactory.close(); } } \ No newline at end of file diff --git a/P/Sda1/Jpa/rdbms2catalog/solution/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Description.java b/P/Sda1/Jpa/rdbms2catalog/solution/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Description.java index 0db107250..ff9283a79 100644 --- a/P/Sda1/Jpa/rdbms2catalog/solution/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Description.java +++ b/P/Sda1/Jpa/rdbms2catalog/solution/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Description.java @@ -1,5 +1,6 @@ package de.hdm_stuttgart.mi.sda1.sql2catalog.model; +import javax.persistence.Column; import javax.persistence.Embeddable; // Class not strictly required but allows for relational table's @@ -14,7 +15,7 @@ public class Description { public Description(final String description) { setDescription(description); } - + @Column(name="text") String description; public String getDescription() { diff --git a/P/Sda1/Jpa/rdbms2catalog/solution/src/main/resources/META-INF/persistence.xml b/P/Sda1/Jpa/rdbms2catalog/solution/src/main/resources/META-INF/persistence.xml index 7d12655f6..964be2ed9 100644 --- a/P/Sda1/Jpa/rdbms2catalog/solution/src/main/resources/META-INF/persistence.xml +++ b/P/Sda1/Jpa/rdbms2catalog/solution/src/main/resources/META-INF/persistence.xml @@ -1,52 +1,60 @@ -<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" +<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" - version="2.1"> + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence + http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> - <persistence-unit name="drop-create" transaction-type="RESOURCE_LOCAL"> + <persistence-unit name = "strategy_drop-and-create"> <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"/> + <!-- + JDBC database connection parameter + --> + + <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" + 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.show_sql" value = "true" /> + <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.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> - <property name="hibernate.archive.autodetection" value="class"/> + <property name = "hibernate.archive.autodetection" value="class"/> </properties> </persistence-unit> - <persistence-unit name="update" transaction-type="RESOURCE_LOCAL"> + <persistence-unit name = "strategy_none"> + <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.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="update"/> + 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.show_sql" value = "true" /> + <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.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> - <property name="hibernate.archive.autodetection" value="class"/> + <property name = "hibernate.archive.autodetection" value="class"/> </properties> </persistence-unit> diff --git a/P/Sda1/Jpa/rdbms2catalog/solution/src/test/java/rdbms2catalog/TestSchema.java b/P/Sda1/Jpa/rdbms2catalog/solution/src/test/java/rdbms2catalog/TestSchema.java index 5be0bba7e..917598381 100644 --- a/P/Sda1/Jpa/rdbms2catalog/solution/src/test/java/rdbms2catalog/TestSchema.java +++ b/P/Sda1/Jpa/rdbms2catalog/solution/src/test/java/rdbms2catalog/TestSchema.java @@ -15,7 +15,7 @@ public class TestSchema { static final EntityManager em; static { - final EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("drop-create"); + final EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("strategy_drop-and-create"); em = emFactory.createEntityManager(); } @@ -26,18 +26,20 @@ public class TestSchema { transaction.begin(); final Product monkeyPickedTea = new Product(1, "Monkey Picked Tea", null); - monkeyPickedTea.getDescriptions().add(new Description("Picked by specially trained monkeys")); - monkeyPickedTea.getDescriptions().add(new Description("Rare wild Chinese tea")); + monkeyPickedTea.getDescriptions().add(new Description("Picked by specially trained monkeys.")); + monkeyPickedTea.getDescriptions().add(new Description("Rare wild Chinese tea.")); final Product instantTent = new Product(2, "4-Person Instant Tent", 15); instantTent.getDescriptions().add(new Description("Exclusive WeatherTec system.")); - instantTent.getDescriptions().add(new Description("4-person, 1-compartment tent")); - instantTent.getDescriptions().add(new Description("Pre-attached tent poles")); + instantTent.getDescriptions().add(new Description("4-person, 1-compartment tent.")); + instantTent.getDescriptions().add(new Description("Pre-attached tent poles.")); em.persist(monkeyPickedTea); em.persist(instantTent); transaction.commit(); + em.close(); + em.getEntityManagerFactory().close(); } } } \ No newline at end of file -- GitLab