From 8380f971a6143607be7fafa4f30b70a97c66f08c Mon Sep 17 00:00:00 2001 From: Martin Goik <goik@hdm-stuttgart.de> Date: Tue, 12 Apr 2016 17:55:11 +0200 Subject: [PATCH] EntityManager variant --- Doc/Sda2/jpa.xml | 205 ++++++++++++++++++++++++----------------------- 1 file changed, 103 insertions(+), 102 deletions(-) diff --git a/Doc/Sda2/jpa.xml b/Doc/Sda2/jpa.xml index 8139bcaa4..2ab29d6b5 100644 --- a/Doc/Sda2/jpa.xml +++ b/Doc/Sda2/jpa.xml @@ -1474,40 +1474,45 @@ CREATE INDEX findCname ON User (cname ASC);</programlisting></td> <tr> <td valign="top"><emphasis role="bold">Java</emphasis></td> - <td valign="top"><programlisting language="none">package hibintro.v8; - ... - @Entity - @Table(name="Person") <co xml:id="renameUserToPerson"/> - public class User { - - int uidNumber; - @Id - @Column(name="numericUid") <co xml:id="renameUidNumberToNumericUid"/> - public int getUidNumber() {return uidNumber;} - public void setUidNumber(int uidNumber) {this.uidNumber = uidNumber;} - - String uid; - @Column(nullable=false) - public String getUid() {return uid;} - public void setUid(String uid) {this.uid = uid;} + <td valign="top"><programlisting language="java">package hibintro.v8; + ... +@Entity +<classname xlink:href="http://docs.oracle.com/javaee/7/api/javax/persistence/Table.html">@Table</classname>(<option + xlink:href="http://docs.oracle.com/javaee/7/api/javax/persistence/Table.html#name--">name</option>="Person") <co + xml:id="renameUserToPerson"/> +public class User { - String cname; - @Column(nullable = false, name="fullName") <co + int uidNumber; + @Id + <classname xlink:href="http://docs.oracle.com/javaee/7/api/javax/persistence/Column.html">@Column</classname>(<option + xlink:href="http://docs.oracle.com/javaee/7/api/javax/persistence/Column.html#name--">name</option>="numericUid") <co + xml:id="renameUidNumberToNumericUid"/> + public int getUidNumber() {return uidNumber;} + public void setUidNumber(int uidNumber) {this.uidNumber = uidNumber;} + + String uid; + @Column(nullable=false) + public String getUid() {return uid;} + public void setUid(String uid) {this.uid = uid;} + + String cname; + <classname xlink:href="http://docs.oracle.com/javaee/7/api/javax/persistence/Column.html">@Column</classname>(<option + xlink:href="http://docs.oracle.com/javaee/7/api/javax/persistence/Column.html#name--">name</option>="fullName", nullable = false) <co xml:id="renameCnameToFullName"/> - public String getCname() {return cname;} - public void setCname(String cname) {this.cname = cname;} - ...</programlisting></td> + public String getCname() {return cname;} + public void setCname(String cname) {this.cname = cname;} + ...</programlisting></td> </tr> <tr> <td valign="top"><emphasis role="bold">Sql</emphasis></td> - <td><programlisting language="none">CREATE TABLE Person <coref + <td><programlisting language="sql">CREATE TABLE Person <coref linkend="renameUserToPerson"/> ( - numericUid <coref linkend="renameUidNumberToNumericUid"/> int(11) NOT NULL PRIMARY KEY, - fullName <coref linkend="renameCnameToFullName"/> varchar(255) NOT NULL, - uid varchar(255) NOT NULL - )</programlisting></td> + numericUid <coref linkend="renameUidNumberToNumericUid"/> int(11) NOT NULL PRIMARY KEY, + fullName <coref linkend="renameCnameToFullName"/> varchar(255) NOT NULL, + uid varchar(255) NOT NULL +)</programlisting></td> </tr> </informaltable> </section> @@ -1542,27 +1547,29 @@ CREATE INDEX findCname ON User (cname ASC);</programlisting></td> <td valign="top"><emphasis role="bold">Java</emphasis></td> <td valign="top"><programlisting language="none">package hibintro.v9; - ... - public class User { - ... - public void setCname(String cname) {this.cname = cname;} - boolean active = false; - @Type(type="yes_no") <co xml:id="remapBooleanChar"/> - public boolean isActive() {return active;} - public void setActive(boolean active) {this.active = active;} - }</programlisting></td> +import org.hibernate.type.Type; + ... +public class User { + ... + public void setCname(String cname) {this.cname = cname;} + + boolean active = false; + @Type(type="yes_no") <co xml:id="remapBooleanChar"/> + public boolean isActive() {return active;} + public void setActive(boolean active) {this.active = active;} +}</programlisting></td> </tr> <tr> <td valign="top"><emphasis role="bold">Sql</emphasis></td> <td><programlisting language="none">CREATE TABLE User ( - uidNumber int(11) NOT NULL PRIMARY KEY, - active char(1) NOT NULL, - cname varchar(255) DEFAULT NULL, - uid varchar(255) NOT NULL - )</programlisting></td> + uidNumber int(11) NOT NULL PRIMARY KEY, + active char(1) NOT NULL, + cname varchar(255) DEFAULT NULL, + uid varchar(255) NOT NULL +)</programlisting></td> </tr> </informaltable> @@ -1594,25 +1601,24 @@ CREATE INDEX findCname ON User (cname ASC);</programlisting></td> <para>Consider the following <xref linkend="glo_XML"/> dataset example:</para> - <programlisting language="none"><catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="cd.xsd"> - <cd id="12"> - <title>Empire Burlesque</title> - <artist>Bob Dylan</artist> - <country>USA</country> - <company>Columbia</company> - <price>10.90</price> - <year>1985</year> - </cd> - <cd id="34"> - <title>Hide your heart</title> - <artist>Bonnie Tylor</artist> - <country>UK</country> - <company>CBS Records</company> - <price>9.90</price> - <year>1988</year> - </cd> - ...</programlisting> + <programlisting language="none"><catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="cd.xsd"> +<cd id="12"> + <title>Empire Burlesque</title> + <artist>Bob Dylan</artist> + <country>USA</country> + <company>Columbia</company> + <price>10.90</price> + <year>1985</year> +</cd> +<cd id="34"> + <title>Hide your heart</title> + <artist>Bonnie Tylor</artist> + <country>UK</country> + <company>CBS Records</company> + <price>9.90</price> + <year>1988</year> +</cd> + ...</programlisting> <section xml:id="sectionXmlJpaJaxbSchema"> <title>Supplying a schema</title> @@ -2898,10 +2904,10 @@ CREATE INDEX findCname ON User (cname ASC);</programlisting></td> <para>We consider a simple example. We may add an email property to <classname>session3.User</classname>:</para> - <programlisting language="none">... - public class User { - ... - private Email address; ...</programlisting> + <programlisting language="java">... +public class User { + ... + private Email address; ...</programlisting> <para>Why do we use a separate class Email rather than a simple <emphasis role="bold"><code>private String email</code></emphasis> @@ -2911,10 +2917,10 @@ CREATE INDEX findCname ON User (cname ASC);</programlisting></td> <programlisting language="none">public class Email { - private String emailAddress; - ... - void sendEmail(final String subject, final String content) {} - }</programlisting> + private String emailAddress; + ... + void sendEmail(final String subject, final String content) {} +}</programlisting> <para>Our <code>Email</code> class may of course have more than just one property. We don't want to email addresses to be database entities @@ -2928,11 +2934,11 @@ CREATE INDEX findCname ON User (cname ASC);</programlisting></td> <glossdef> <programlisting language="none">package component.email; - <emphasis role="bold"> @Embeddable</emphasis> public class Email { +<emphasis role="bold">@Embeddable</emphasis> public class Email { - private String emailAddress; - ... - }</programlisting> + private String emailAddress; + ... +}</programlisting> </glossdef> </glossentry> @@ -2942,13 +2948,13 @@ CREATE INDEX findCname ON User (cname ASC);</programlisting></td> <glossdef> <programlisting language="none">package component.email; - ... - public class User { + ... +public class User { - private Email address; - <emphasis role="bold">@Embedded</emphasis> - public Email getEmailAddress() { return address;} - ...</programlisting> + private Email address; + <emphasis role="bold">@Embedded</emphasis> + public Email getEmailAddress() { return address;} + ...</programlisting> </glossdef> </glossentry> </glosslist> @@ -2956,17 +2962,14 @@ CREATE INDEX findCname ON User (cname ASC);</programlisting></td> <para>We may now persist <classname>component.email.User</classname> instances:</para> - <programlisting language="none">package component.email; - ... - public class PersistUser { - ... - { - final Transaction transaction = session.beginTransaction(); - final User u = new User(123, "goik", "Martin Goik"); - u.setEmailAddress(<emphasis role="bold">new Email("goik@hdm-stuttgart.de")</emphasis>); - session.save(u); - transaction.commit(); - } ...</programlisting> + <programlisting language="none">em.getTransaction().begin(); +{ + final User u = new User(123, "goik", "Martin Goik"); + u.setEmailAddress(new Email("goik@hdm-stuttgart.de")); + em.persist(u); +} +em.getTransaction().commit(); +</programlisting> <qandaset defaultlabel="qanda" xml:id="quandaentry_HomeWorAddress"> <title>Home and work address</title> @@ -2974,23 +2977,21 @@ CREATE INDEX findCname ON User (cname ASC);</programlisting></td> <qandadiv> <qandaentry> <question> - <para>Consider the following sketch of an address class:</para> + <para>Consider the following sketch of an + <classname>Address</classname> class:</para> <programlisting language="none">public class Address { - private String street; - private String city; - private String zipcode; - ... - }</programlisting> - - <para>Extend class <classname>session3.User</classname> to allow - for two properties <code>homeAddress</code> and - <code>workAddress</code> of type Address. You will encounter a - problem concerning conflicting database attribute names. The - hibernate forum does provide a <link - xlink:href="https://forum.hibernate.org/viewtopic.php?p=2432511">hint</link> - to resolve this issue in favour of multiple + private String street; + private String city; + private String zipcode; + ... +}</programlisting> + + <para>Extend this example to allow for two properties + <code>homeAddress</code> and <code>workAddress</code> of type + Address. You will encounter a problem concerning conflicting + database attribute names. Resolution is possible using <code>@javax.persistence.AttributeOverrides</code> declarations.</para> </question> -- GitLab