diff --git a/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Rdbms2Xml.java b/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Rdbms2Xml.java index 052b0e9261c5ee81e9a27911cbe69214260cf149..fc40375ebf62e313d621a15057aecbc76fa939b7 100644 --- a/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Rdbms2Xml.java +++ b/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Rdbms2Xml.java @@ -1,9 +1,6 @@ package de.hdm_stuttgart.mi.sda1.sql2catalog; import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; import javax.xml.parsers.ParserConfigurationException; @@ -13,7 +10,8 @@ import org.jdom2.output.XMLOutputter; import org.xml.sax.SAXException; /** - * A simple SAX parser demo + * Dumping RDBMS catalog data + * to XML. * */ public class Rdbms2Xml { @@ -28,47 +26,11 @@ public class Rdbms2Xml { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { - - - // Register Driver - final String sqlDriverClassName = Messages.getString("Xml2Rdbms.jdbcDriverName"); - try { - Class.forName(sqlDriverClassName); - } catch (ClassNotFoundException e) { - Helper.exitWithErrorMessage(Messages.getString("Xml2Rdbms.errMsgUnableRegisterDriverClass") + sqlDriverClassName + "'", 1); - } - - - // Opening a JDBC connection - // - Connection conn = null; - - final String jdbcConnectionUrl = Messages.getString("Xml2Rdbms.jdbcUrl"); - final String userName = Messages.getString("Xml2Rdbms.jdbcUser"); - try { - conn = DriverManager.getConnection(jdbcConnectionUrl, userName, Messages.getString("Xml2Rdbms.jdbcPasswd")); - } catch (SQLException e) { - Helper.exitWithErrorMessage(Messages.getString("Xml2Rdbms.errMsgUnableToConnect") + userName + "' to '" + - jdbcConnectionUrl + "'", 1); - } - - RdbmsAccess rdbmsAccess = null; - try { - rdbmsAccess = new RdbmsAccess(conn); - } catch (SQLException e) { - Helper.exitWithErrorMessage(Messages.getString("Xml2Rdbms.errMsgUnableInitDataInsert"), 1); - } - final Element catalogElement = new Element("catalog"); - try { - rdbmsAccess.appendProducts(catalogElement); - } catch (SQLException e) { - Helper.exitWithErrorMessage("Unable to read database:" + e.getLocalizedMessage(), 1); - } + new RdbmsAccess().appendProducts(catalogElement); // Write XML content to standard output XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); outputter.output(catalogElement, System.out); } - } diff --git a/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/RdbmsAccess.java b/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/RdbmsAccess.java index d13fc1070fc39906b9af984eb3be977bd7248bfd..4852ef1fd16302823e633464a2dad821449aa5ce 100644 --- a/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/RdbmsAccess.java +++ b/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/RdbmsAccess.java @@ -1,63 +1,62 @@ package de.hdm_stuttgart.mi.sda1.sql2catalog; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.EntityTransaction; +import javax.persistence.Persistence; import org.jdom2.Element; +import de.hdm_stuttgart.mi.sda1.sql2catalog.model.Description; +import de.hdm_stuttgart.mi.sda1.sql2catalog.model.Product; + /** * Reading product data * */ public class RdbmsAccess { - - final PreparedStatement selectProduct, selectDescription; - - /** - * @param conn Destination RDBMS - * @throws SQLException - */ - public RdbmsAccess(final Connection conn) throws SQLException { - conn.setAutoCommit(false); - selectProduct = conn.prepareStatement("SELECT * FROM Product"); - selectDescription = conn.prepareStatement("SELECT * FROM Description WHERE product = ? ORDER BY orderIndex"); + + static final EntityManager em; + + static { + final EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("none"); + em = emFactory.createEntityManager(); } - - public void appendProducts(final Element root) throws SQLException { - final ResultSet products = selectProduct.executeQuery(); - - while (products.next()) { - final int productId = products.getInt("id"); - final Element productElement = new Element("product"); - root.addContent(productElement); - productElement.setAttribute("id", "" + productId); - - final Element nameElement = new Element("name"); - productElement.addContent(nameElement); - nameElement.addContent(products.getString("name")); - - addDescriptions(productId, productElement); - - final int productAge = products.getInt("age"); - if (!products.wasNull()) { - final Element ageElement = new Element("age"); - productElement.addContent(ageElement); - ageElement.addContent("" + productAge); - } - } - products.close(); + + public void appendProducts(final Element root) { + final EntityTransaction transaction = em.getTransaction(); + transaction.begin(); + + 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 nameElement = new Element("name"); + productElement.addContent(nameElement); + nameElement.addContent(p.getName()); + + addDescriptions(p.getDescriptions(), productElement); + + final Integer productAge = p.getAge(); + if (null != productAge) { + final Element ageElement = new Element("age"); + productElement.addContent(ageElement); + ageElement.addContent(productAge.toString()); + } + } + transaction.commit(); } - - private void addDescriptions(final int productId, final Element productElement) throws SQLException { - selectDescription.setInt(1, productId); - final ResultSet descriptions = selectDescription.executeQuery(); - while (descriptions.next()) { - final Element descriptionElement = new Element("description"); - productElement.addContent(descriptionElement); - descriptionElement.addContent(descriptions.getString("text")); - } - descriptions.close(); + + private void addDescriptions(final List<Description> desccriptions, final Element productElement) { + + for(Description d: desccriptions) { + final Element descriptionElement = new Element("description"); + productElement.addContent(descriptionElement); + descriptionElement.addContent(d.getText()); + } } -} +} \ No newline at end of file diff --git a/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Description.java b/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Description.java index 48d24a54682d6f6e37087acac8817635327cdfdf..05a778664cc4f42c4178815086ee6888f470a003 100644 --- a/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Description.java +++ b/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Description.java @@ -2,26 +2,35 @@ package de.hdm_stuttgart.mi.sda1.sql2catalog.model; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; - +@Table( + uniqueConstraints= + @UniqueConstraint(columnNames={"product", "orderIndex"}) + ) @Entity public class Description { @Id + @GeneratedValue Long id; protected Description(){} - protected Description (final Product product, final int orderIndex, final String text) { + public Description (final Product product, final int orderIndex, final String text) { this.product = product; this.orderIndex = orderIndex; this.text = text; + product.descriptions.add(this); } @ManyToOne - @Column(nullable=false) + @JoinColumn(name="product") Product product; int orderIndex; diff --git a/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Product.java b/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Product.java index ee5386c8805f027587efe736b82c672e2922a2dc..90f2eaa30788fe6e876eb126c3e3a48b75a81067 100644 --- a/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Product.java +++ b/P/Sda1/rdbms2catalogJpa/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/model/Product.java @@ -1,7 +1,9 @@ package de.hdm_stuttgart.mi.sda1.sql2catalog.model; +import java.util.ArrayList; import java.util.List; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; @@ -9,17 +11,50 @@ import javax.persistence.OneToMany; @Entity public class Product { - - @Id - int id; - - @Column(nullable=false) - String name; - - int age; - - @OneToMany(mappedBy = "product") - List<Description> descriptions; - - + + protected Product() {} + + public Product(final int id, final String name, final Integer age) { + setId(id); + setName(name); + setAge(age); + } + + @Id + int id; + + @Column(nullable = false) + String name; + + Integer age; + + @OneToMany(mappedBy = "product", cascade=CascadeType.ALL) + List<Description> descriptions = new ArrayList<Description>(); + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + public List<Description> getDescriptions() { + return descriptions; + } } diff --git a/P/Sda1/rdbms2catalogJpa/src/main/resources/META-INF/persistence.xml b/P/Sda1/rdbms2catalogJpa/src/main/resources/META-INF/persistence.xml index 2e8b4a41c27055cc252c64480580fa1b736c0edf..6431ae651f354c8aa4a60111410b54cebf59992b 100644 --- a/P/Sda1/rdbms2catalogJpa/src/main/resources/META-INF/persistence.xml +++ b/P/Sda1/rdbms2catalogJpa/src/main/resources/META-INF/persistence.xml @@ -4,20 +4,20 @@ http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1"> - <persistence-unit name="jpa-update" transaction-type="RESOURCE_LOCAL"> + <persistence-unit name="create-drop" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> - + <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/hdm" /> <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="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> - <property name="hibernate.hbm2ddl.auto" value="update" /> - + <property name="hibernate.hbm2ddl.auto" value="create-drop" /> + <!-- Configuring Connection Pool --> <property name="hibernate.c3p0.min_size" value="5" /> @@ -25,8 +25,33 @@ <property name="hibernate.c3p0.timeout" value="500" /> <property name="hibernate.c3p0.max_statements" value="50" /> <property name="hibernate.c3p0.idle_test_period" value="2000" /> + + </properties> + </persistence-unit> + <persistence-unit name="none" transaction-type="RESOURCE_LOCAL"> + <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> + + <properties> + <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/hdm" /> + <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="hibernate.show_sql" value="true" /> + <property name="hibernate.format_sql" value="true" /> + <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> + <property name="hibernate.hbm2ddl.auto" value="none" /> + + <!-- Configuring Connection Pool --> + + <property name="hibernate.c3p0.min_size" value="5" /> + <property name="hibernate.c3p0.max_size" value="20" /> + <property name="hibernate.c3p0.timeout" value="500" /> + <property name="hibernate.c3p0.max_statements" value="50" /> + <property name="hibernate.c3p0.idle_test_period" value="2000" /> + </properties> </persistence-unit> - + </persistence> \ No newline at end of file diff --git a/P/Sda1/rdbms2catalogJpa/src/test/java/rdbms2catalog/TestSchema.java b/P/Sda1/rdbms2catalogJpa/src/test/java/rdbms2catalog/TestSchema.java new file mode 100644 index 0000000000000000000000000000000000000000..896f0d3cf8345e441c216bd5137971839b11c780 --- /dev/null +++ b/P/Sda1/rdbms2catalogJpa/src/test/java/rdbms2catalog/TestSchema.java @@ -0,0 +1,43 @@ +package rdbms2catalog; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.EntityTransaction; +import javax.persistence.Persistence; + +import org.junit.Test; + +import de.hdm_stuttgart.mi.sda1.sql2catalog.model.Description; +import de.hdm_stuttgart.mi.sda1.sql2catalog.model.Product; + +public class TestSchema { + + static final EntityManager em; + + static { + final EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("create-drop"); + em = emFactory.createEntityManager(); + } + + @Test + 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, 1, "Rare wild Chinese tea"); + + final Product instantTent = new Product(2, "4-Person Instant Tent", 15); + new Description(instantTent, 0, "Exclusive WeatherTec system."); + new Description(instantTent, 1, "4-person, 1-compartment tent"); + new Description(instantTent, 2, "Pre-attached tent poles"); + + em.persist(monkeyPickedTea); + em.persist(instantTent); + + transaction.commit(); + } + } +} \ No newline at end of file