From 24424bf48cf5e3ea6d6b93837743f74941dfb20b Mon Sep 17 00:00:00 2001 From: Martin Goik <goik@hdm-stuttgart.de> Date: Mon, 11 Apr 2016 21:03:46 +0200 Subject: [PATCH] Maven archetype corrected, constructor will be protected --- Doc/Sda2/jpa.xml | 343 +++++++++++------- .../META-INF/maven/archetype-metadata.xml | 4 +- .../main/resources/META-INF/persistence.xml | 5 +- .../src/main/java/hibintro/v1/User.java | 3 +- .../src/main/java/hibintro/v2/User.java | 6 +- .../src/main/java/hibintro/v3/User.java | 30 +- .../src/main/java/hibintro/v4/User.java | 21 +- .../src/main/java/hibintro/v5/User.java | 34 +- .../src/main/java/hibintro/v7/User.java | 25 +- .../src/main/java/hibintro/v8/User.java | 24 +- 10 files changed, 263 insertions(+), 232 deletions(-) diff --git a/Doc/Sda2/jpa.xml b/Doc/Sda2/jpa.xml index 90608edc6..6d7c532f6 100644 --- a/Doc/Sda2/jpa.xml +++ b/Doc/Sda2/jpa.xml @@ -133,8 +133,9 @@ </listitem> </orderedlist> - <para>Â But wait: We are about to work with (Mysql) databases. Thus we - need at least a <trademark + <para>Â But wait: We are about to work with (<xref + linkend="glo_Soft_Mysql"/>) databases. Thus we need at least a + <trademark xlink:href="http://www.oracle.com/technetwork/java/javase/jdbc">JDBC</trademark> driver. Maven assists us if we define an appropriate dependency as we will see in the following section.</para> @@ -257,6 +258,11 @@ <artifactId>hibernate-entitymanager</artifactId> <version>5.1.0.Final</version> </dependency></programlisting> + + <para>The MI department provides a dedicated archetype + <quote>mi-maven-archetype-jpa-hibernate</quote>. See <xref + linkend="sd1SectUsingMavenEclipse"/> for archetype repository + configuration.</para> </section> <section xml:id="sect_createHibernateConfiguration"> @@ -317,34 +323,84 @@ linkend="glo_Soft_Mysql"/> database server:</para> <figure xml:id="hibernateConfigurationFile"> - <title>A basic Hibernate configuration file - <filename>hibernate.cfg.xml</filename>.</title> - - <programlisting language="none"><?xml version="1.0" encoding="UTF-8"?> - <!DOCTYPE hibernate-configuration PUBLIC - "-//Hibernate/Hibernate Configuration DTD 3.0//EN" - "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> - - <hibernate-configuration> - <session-factory > - <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> - <property name="hibernate.connection.password">XYZ</property> - <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hdm</property> - <property name="hibernate.connection.username">hdmuser</property> - <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> - <property name="hibernate.show_sql">true</property> - <property name="hibernate.format_sql">true</property> - <property name="hibernate.hbm2ddl.auto">update</property> - - <mapping class="hibintro.v1.model.User"/> - </session-factory> - </hibernate-configuration></programlisting> + <title>A basic <filename>persistence.xml</filename> <xref + linkend="glo_JPA"/> configuration file.</title> + + <programlisting language="xml"><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"> + + <!-- + The <code>persistence.xml</code> file configures at least one persistence unit; + each unit must have a unique name. + --> + <persistence-unit name="entitytemplatePU"> + + <!-- + Hibernate will scan your classpath for mapped classes and add them automatically + to your persistence unit. + <exclude-unlisted-classes>false</exclude-unlisted-classes> + --> + <exclude-unlisted-classes>false</exclude-unlisted-classes> + + <!-- + Disabling the previous option "exclude-unlisted-classes" requires entity classes to + be listed explicitely. You may want to uncomment the following definition. + + <class>my.base.url.Airline</class> + --> + + <!-- + Standard or vendor-specific options can be set as properties on a persistence unit. + Any standard properties have the <code>javax.persistence</code> name prefix, Hibernate's + settings use <code>hibernate</code> + --> + <properties> + <!-- + 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"/> + <property name="javax.persistence.jdbc.user" value="hdmuser"/> + <property name="javax.persistence.jdbc.password" value="XYZ"/> + + <!-- + The JPA engine should drop and re-create the SQL schema in the database + automatically when it boots. This is ideal for automated testing, when + you want to work with a clean database for every test run. + --> + <property + name="javax.persistence.schema-generation.database.action" + value="drop-and-create"/> + + <!-- + When printing SQL in logs, let Hibernate format the SQL nicely and generate + comments into the SQL string so we know why Hibernate executed the SQL statement. + --> + <property name="hibernate.format_sql" value="true"/> + <property name="hibernate.use_sql_comments" value="true"/> + + <!-- Enable Hibernate scanning for entity classes and adding them automatically + but not for hbm.xml files. --> + <property name="hibernate.archive.autodetection" value="class"/> + + </properties> + </persistence-unit> + +</persistence></programlisting> </figure> - <para>This file may be edited with a simple text editor. The Eclipse - <productname xlink:href="https://www.jboss.org/tools">Jboss - Tools</productname> Eclipse plugin provides a configuration editor - simplifying this task. They may be installed on top of Eclipse <link + <para>This file may be edited with a simple text editor. Note the + <filename>persistence_2_1.xsd</filename> schema which allows for + validation.</para> + + <para>The Eclipse <productname + xlink:href="https://www.jboss.org/tools">Jboss Tools</productname> + Eclipse plugin provides a configuration editor simplifying this task. + They may be installed on top of Eclipse <link xlink:href="https://www.jboss.org/tools/download">in several ways</link>. The following video shows some of its features.</para> @@ -372,33 +428,6 @@ </mediaobject> </figure> - <para>Having configured Hibernate we may now start working with <xref - linkend="glo_Java"/> objects. To do so we need an appropriate session - object to run transactions. Starting from the Hibernate documentation we - code the following helper method:</para> - - <programlisting language="none">package hibintro.util; - - import org.hibernate.SessionFactory; - import org.hibernate.cfg.Configuration; - import org.hibernate.service.ServiceRegistryBuilder; - - public class HibernateUtil { - - /** - * @param hibernateConfigFileName The filename defaults to <code>hibernate.cfg.xml</code>. - * @return Session factory instance to be used for actual session creation by caller. - */ - public static SessionFactory createSessionFactory(final String hibernateConfigFileName) { - Configuration configuration = new Configuration(); - configuration.configure(hibernateConfigFileName); - ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder().applySettings(configuration - .getProperties()); - return configuration - .buildSessionFactory(serviceRegistryBuilder.buildServiceRegistry()); - } - }</programlisting> - <para>The following class <classname>hibintro.v1.model.User</classname> will be used as a starting example to be mapped to a database. Notice the <classname>javax.persistence.Entity</classname> <link @@ -409,48 +438,77 @@ <title>Mapping <classname>hibintro.v1.model.User</classname> instances to a database.</title> - <programlisting language="none">package hibintro.v1.model; - - ... - - <emphasis role="bold">@Entity</emphasis> <co xml:id="entityAnnotation"/> - public class User { - - <emphasis role="bold">//The user's unique login name e.g. "goik"</emphasis> - String uid; - public String getUid() {return uid;} - public void setUid(String uid) {this.uid = uid;} - - <emphasis role="bold">// The user's common name e.g. "Martin Goik"</emphasis> - String cname; - public String getCname() {return cname;} - public void setCname(String cname) {this.cname = cname;} - - <emphasis role="bold">// Hibernate requires a default constructor</emphasis> - public User() {} - - public User(String uid, String cname) { - super(); - this.uid = uid; - this.cname = cname; - } - }</programlisting> + <programlisting language="java">package hibintro.v1; + +import javax.persistence.Entity; +import javax.persistence.Id; + +/** + * A simple class intended to be mapped to a database server + * + */ +@Entity <co xml:id="entityAnnotation"/> +public class User { + + String uid; + /** + * @return The user's unique login name e.g. "goik" + */ + @Id + public String getUid() { + return uid; + } + /** + * @param uid See {@link #getUid()}. + */ + public void setUid(String uid) { + this.uid = uid; + } + String cname; + /** + * @return The user's common name e.g. "Martin Goik" + */ + public String getCname() { + return cname; + } + /** + * @param cname See {@link #getCname()}. + */ + public void setCname(String cname) { + this.cname = cname; + } + + /** + * Hibernate/JPA require a default constructor. It has has to be + * implemented if any non-default constructor has been defined + */ + public User() {} + + /** + * @param uid See {@link #getUid()}. + * @param cname See {@link #getCname()}. + */ + public User(String uid, String cname) { + this.uid = uid; + this.cname = cname; + } +}</programlisting> </figure> <para>With respect to <xref linkend="hibernateConfigurationFile"/> we notice our class <classname>hibintro.v1.model.User</classname> being referenced:</para> - <programlisting language="none"><?xml version="1.0" encoding="UTF-8"?> - <!DOCTYPE hibernate-configuration - ... - <mapping class="<emphasis role="bold">hibintro.v1.model.User</emphasis>"/> - </session-factory> - </hibernate-configuration></programlisting> + <programlisting language="xml"><persistence ... > + + <persistence-unit name="hibintroV1PU"> + <emphasis role="bold"><class><classname>hibintro.v1.User</classname></class></emphasis> + ... + </persistence-unit> + ...</programlisting> <para>This line tells Hibernate to actually map - <classname>hibintro.v1.model.User</classname> to a (Mysql) - database.</para> + <classname>hibintro.v1.model.User</classname> to the database.</para> <section xml:id="persistingObjects"> <title>Persisting objects</title> @@ -890,22 +948,64 @@ need an additional <emphasis role="bold">GUI related</emphasis> property <code>selected</code> <coref linkend="propertyIsSelected"/>:</para> - <programlisting language="none">package hibintro.v2; - - - @Entity public class User { - ... - boolean <emphasis role="bold">selected</emphasis> <co - xml:id="propertyIsSelected"/> = false; - - public boolean isSelected() { - return selected; - } - public void setSelected(boolean selected) { - this.selected = selected; - } - ... - }</programlisting> + <programlisting language="java">package hibintro.v2; + +import javax.persistence.Entity; +import javax.persistence.Id; + +/** + * A simple class intended to be mapped to a database server + */ +@Entity +public class User { + + String uid; + /** + * @return The user's unique login name e.g. "goik" + */ + @Id + public String getUid() { + return uid; + } + /** + * @param uid See {@link #getUid()}. + */ + public void setUid(String uid) { + this.uid = uid; + } + String cname; + /** + * @return The user's common name e.g. "Martin Goik" + */ + public String getCname() { + return cname; + } + /** + * @param cname See {@link #getCname()}. + */ + public void setCname(String cname) { + this.cname = cname; + } + + boolean selected = false; <co xml:id="propertyIsSelected"/> + + public boolean isSelected() { + return selected; + } + public void setSelected(boolean selected) { + this.selected = selected; + } + protected User() {} + + /** + * @param uid See {@link #getUid()}. + * @param cname See {@link #getCname()}. + */ + public User(String uid, String cname) { + this.uid = uid; + this.cname = cname; + } +}</programlisting> <para>Hibernates produces the following <abbrev xlink:href="https://en.wikipedia.org/wiki/Data_definition_language">DDL</abbrev> @@ -920,11 +1020,11 @@ <para>If we just annotate a Java class with an <classname>javax.persistence.Entity</classname> Annotation all - properties of the class in question will be mapped. The Hibernate - framework of course cannot distinguish between transient and persistent - properties. If we want a property to be transient we have to add a - <classname>javax.persistence.Transient</classname> annotation to the - corresponding getter method:</para> + properties of the class in question will be mapped. A <xref + linkend="glo_JPA"/> framework of course cannot distinguish between + transient and persistent properties. If we want a property to be + transient we have to add a + <classname>javax.persistence.Transient</classname> annotation:</para> <informaltable border="1"> <colgroup width="6%"/> @@ -934,18 +1034,17 @@ <tr> <td valign="top"><emphasis role="bold">Java</emphasis></td> - <td valign="top"><programlisting language="none">package hibintro.v3; - ... - @Entity - public class User { - ... - boolean selected = false; - @Transient <co xml:id="transientAnnotation"/> public boolean isSelected() { - return selected; - } - public void setSelected(boolean selected) { - this.selected = selected; - }...</programlisting></td> + <td valign="top"><programlisting language="java">package hibintro.v3; + +@Entity +public class User { + ... + boolean selected = false; + @Transient <co xml:id="transientAnnotation"/> + public boolean isSelected() { return selected; } + public void setSelected(boolean selected) { this.selected = selected; } + ... +}</programlisting></td> </tr> <tr> diff --git a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/META-INF/maven/archetype-metadata.xml b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/META-INF/maven/archetype-metadata.xml index fc92551e8..f7ea5a7df 100644 --- a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -9,13 +9,13 @@ <include>**/*.java</include> </includes> </fileSet> - <fileSet filtered="true" encoding="UTF-8"> + <fileSet filtered="true" packaged="true" encoding="UTF-8"> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> </includes> </fileSet> - <fileSet filtered="true" packaged="true" encoding="UTF-8"> + <fileSet filtered="true" encoding="UTF-8"> <directory>src/test/java</directory> <includes> <include>**/*.java</include> diff --git a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/resources/META-INF/persistence.xml b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/resources/META-INF/persistence.xml index 0294fbf9a..764930052 100644 --- a/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/resources/META-INF/persistence.xml +++ b/ws/Archetypes/mi-maven-archetype-jpa-hibernate/src/main/resources/archetype-resources/src/main/resources/META-INF/persistence.xml @@ -17,13 +17,12 @@ <!-- Hibernate will scan your classpath for mapped classes and add them automatically to your persistence unit. - <exclude-unlisted-classes>false</exclude-unlisted-classes> --> <exclude-unlisted-classes>false</exclude-unlisted-classes> <!-- - Disabling the previous option "exclude-unlisted-classes" requires entity classes to - be listed explicitely. You may want to uncomment the following definition. + setting the previous option "exclude-unlisted-classes" to 'true' requires entity classes to + be listed explicitely. You may want to uncomment the following definition and add more classes. <class>${package}.Airline</class> --> diff --git a/ws/eclipse/HibIntro/src/main/java/hibintro/v1/User.java b/ws/eclipse/HibIntro/src/main/java/hibintro/v1/User.java index c3c296209..41adabf8e 100644 --- a/ws/eclipse/HibIntro/src/main/java/hibintro/v1/User.java +++ b/ws/eclipse/HibIntro/src/main/java/hibintro/v1/User.java @@ -12,7 +12,6 @@ public class User { String uid; /** - * * @return The user's unique login name e.g. "goik" */ @Id @@ -43,7 +42,7 @@ public class User { * Hibernate/JPA require a default constructor. It has has to be * implemented if any non-default constructor has been defined */ - public User() {} + protected User() {} /** * @param uid See {@link #getUid()}. diff --git a/ws/eclipse/HibIntro/src/main/java/hibintro/v2/User.java b/ws/eclipse/HibIntro/src/main/java/hibintro/v2/User.java index 03bd2feab..c87dc0b80 100644 --- a/ws/eclipse/HibIntro/src/main/java/hibintro/v2/User.java +++ b/ws/eclipse/HibIntro/src/main/java/hibintro/v2/User.java @@ -11,7 +11,6 @@ public class User { String uid; /** - * * @return The user's unique login name e.g. "goik" */ @Id @@ -46,10 +45,7 @@ public class User { public void setSelected(boolean selected) { this.selected = selected; } -/** - * Hibernate/JPA require a default constructor - */ - public User() {} + protected User() {} /** * @param uid See {@link #getUid()}. diff --git a/ws/eclipse/HibIntro/src/main/java/hibintro/v3/User.java b/ws/eclipse/HibIntro/src/main/java/hibintro/v3/User.java index ddd4f25b9..969df9a4b 100644 --- a/ws/eclipse/HibIntro/src/main/java/hibintro/v3/User.java +++ b/ws/eclipse/HibIntro/src/main/java/hibintro/v3/User.java @@ -15,41 +15,27 @@ public class User { * @return The user's unique login name e.g. "goik" */ @Id - public String getUid() { - return uid; - } + public String getUid() { return uid; } /** * @param uid See {@link #getUid()}. */ - public void setUid(String uid) { - this.uid = uid; - } + public void setUid(String uid) { this.uid = uid; } String cname; /** * @return The user's common name e.g. "Martin Goik" */ - public String getCname() { - return cname; - } + public String getCname() { return cname; } /** * @param cname See {@link #getCname()}. */ - public void setCname(String cname) { - this.cname = cname; - } + public void setCname(String cname) { this.cname = cname; } boolean selected = false; @Transient - public boolean isSelected() { - return selected; - } - public void setSelected(boolean selected) { - this.selected = selected; - } -/** - * Hibernate/JPA require a default constructor - */ - public User() {} + public boolean isSelected() { return selected; } + public void setSelected(boolean selected) { this.selected = selected; } + + protected User() {} /** * @param uid See {@link #getUid()}. diff --git a/ws/eclipse/HibIntro/src/main/java/hibintro/v4/User.java b/ws/eclipse/HibIntro/src/main/java/hibintro/v4/User.java index 4b43f01fd..25fbd45ec 100644 --- a/ws/eclipse/HibIntro/src/main/java/hibintro/v4/User.java +++ b/ws/eclipse/HibIntro/src/main/java/hibintro/v4/User.java @@ -12,38 +12,29 @@ public class User { String uid; /** - * * @return The user's unique login name e.g. "goik" */ @Id - public String getUid() { - return uid; - } + public String getUid() { return uid; } /** * @param uid See {@link #getUid()}. */ - public void setUid(String uid) { - this.uid = uid; - } + public void setUid(String uid) { this.uid = uid; } String cname; /** * @return The user's common name e.g. "Martin Goik" */ @Column(nullable = false) - public String getCname() { - return cname; - } + public String getCname() { return cname; } /** * @param cname See {@link #getCname()}. */ - public void setCname(String cname) { - this.cname = cname; - } + public void setCname(String cname) { this.cname = cname; } -/** + /** * Hibernate/JPA require a default constructor */ - public User() {} + protected User() {} /** * @param uid See {@link #getUid()}. diff --git a/ws/eclipse/HibIntro/src/main/java/hibintro/v5/User.java b/ws/eclipse/HibIntro/src/main/java/hibintro/v5/User.java index 451bad494..e72106a8b 100644 --- a/ws/eclipse/HibIntro/src/main/java/hibintro/v5/User.java +++ b/ws/eclipse/HibIntro/src/main/java/hibintro/v5/User.java @@ -15,31 +15,21 @@ public class User { int uidNumber; @Id - public int getUidNumber() { - return uidNumber; - } - public void setUidNumber(int uidNumber) { - this.uidNumber = uidNumber; - } + public int getUidNumber() { return uidNumber; } + public void setUidNumber(int uidNumber) { this.uidNumber = uidNumber; } String uid; /** - * * @return The user's unique login name e.g. "goik" */ @Column(nullable=false) - public String getUid() { - return uid; - } + public String getUid() { return uid; } /** - * @param uid - * See {@link #getUid()}. + * @param uid, See {@link #getUid()}. */ - public void setUid(String uid) { - this.uid = uid; - } + public void setUid(String uid) { this.uid = uid; } String cname; @@ -47,23 +37,17 @@ public class User { * @return The user's common name e.g. "Martin Goik" */ @Column(nullable = false) - public String getCname() { - return cname; - } + public String getCname() { return cname; } /** - * @param cname - * See {@link #getCname()}. + * @param cname See {@link #getCname()}. */ - public void setCname(String cname) { - this.cname = cname; - } + public void setCname(String cname) { this.cname = cname; } /** * Hibernate/JPA require a default constructor */ - public User() { - } + protected User() {} /** * @param uidNumber See {@link #getUidNumber()}. diff --git a/ws/eclipse/HibIntro/src/main/java/hibintro/v7/User.java b/ws/eclipse/HibIntro/src/main/java/hibintro/v7/User.java index 687a4efb3..3ef35d144 100644 --- a/ws/eclipse/HibIntro/src/main/java/hibintro/v7/User.java +++ b/ws/eclipse/HibIntro/src/main/java/hibintro/v7/User.java @@ -22,9 +22,7 @@ public class User { public int getUidNumber() { return uidNumber; } - public void setUidNumber(int uidNumber) { - this.uidNumber = uidNumber; - } + public void setUidNumber(int uidNumber) { this.uidNumber = uidNumber; } String uid; @@ -33,17 +31,13 @@ public class User { * @return The user's unique login name e.g. "goik" */ @Column(nullable=false) - public String getUid() { - return uid; - } + public String getUid() { return uid; } /** * @param uid * See {@link #getUid()}. */ - public void setUid(String uid) { - this.uid = uid; - } + public void setUid(String uid) { this.uid = uid; } String cname; @@ -51,24 +45,19 @@ public class User { * @return The user's common name e.g. "Martin Goik" */ @Column(nullable = false) - public String getCname() { - return cname; - } + public String getCname() { return cname; } /** * @param cname * See {@link #getCname()}. */ - public void setCname(String cname) { - this.cname = cname; - } + public void setCname(String cname) { this.cname = cname; } /** * Hibernate/JPA require a default constructor */ - public User() { - } - + protected User() {} + /** * @param uidNumber See {@link #getUidNumber()}. * @param uid See {@link #getUid()}. diff --git a/ws/eclipse/HibIntro/src/main/java/hibintro/v8/User.java b/ws/eclipse/HibIntro/src/main/java/hibintro/v8/User.java index 4eb0ad5fb..87e320d93 100644 --- a/ws/eclipse/HibIntro/src/main/java/hibintro/v8/User.java +++ b/ws/eclipse/HibIntro/src/main/java/hibintro/v8/User.java @@ -19,9 +19,7 @@ public class User { public int getUidNumber() { return uidNumber; } - public void setUidNumber(int uidNumber) { - this.uidNumber = uidNumber; - } + public void setUidNumber(int uidNumber) { this.uidNumber = uidNumber; } String uid; @@ -29,16 +27,12 @@ public class User { * @return The user's unique login name e.g. "goik" */ @Column(nullable=false) - public String getUid() { - return uid; - } + public String getUid() { return uid; } /** * @param uid * See {@link #getUid()}. */ - public void setUid(String uid) { - this.uid = uid; - } + public void setUid(String uid) { this.uid = uid; } String cname; @@ -46,23 +40,17 @@ public class User { * @return The user's common name e.g. "Martin Goik" */ @Column(nullable = false, name="fullName") - public String getCname() { - return cname; - } + public String getCname() { return cname; } /** * @param cname * See {@link #getCname()}. */ - public void setCname(String cname) { - this.cname = cname; - } + public void setCname(String cname) { this.cname = cname; } /** * Hibernate/JPA require a default constructor */ - public User() { - } - + protected User() {} /** * @param uidNumber See {@link #getUidNumber()}. * @param uid See {@link #getUid()}. -- GitLab