diff --git a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/incubator.xml b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/incubator.xml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/CreateStudyCourse.java b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/CreateStudyCourse.java index 5cc21b890605f7f55e5f32c2887d1a0c7beb978d..a04c95689f2a4f9cfc777f04a37e81a531f22476 100644 --- a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/CreateStudyCourse.java +++ b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/CreateStudyCourse.java @@ -28,12 +28,10 @@ public class CreateStudyCourse { final EntityTransaction tx = entityManager.getTransaction(); - log.info("Begin transaction"); final StudyCourse csm = new StudyCourse( "CSM", "Computer Science and Media"); log.info(csm); - tx.begin(); entityManager.persist(csm); tx.commit(); diff --git a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/CriteriumReadLikeC_courses.java b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/CriteriumReadLikeC_courses.java new file mode 100644 index 0000000000000000000000000000000000000000..ea94f27e2ad80de704519f70a9626f724e551fb3 --- /dev/null +++ b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/CriteriumReadLikeC_courses.java @@ -0,0 +1,40 @@ +package de.hdm_stuttgart.mi.sda1; + +import de.hdm_stuttgart.mi.sda1.model.StudyCourse; +import de.hdm_stuttgart.mi.sda1.model.StudyCourse_; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.util.List; + +/** + * Read {@link StudyCourse} instances by criteria query. + */ +public class CriteriumReadLikeC_courses { + + static private final EntityManagerFactory factory = Persistence.createEntityManagerFactory( + "strategy_none"); + + static private final EntityManager entityManager = factory.createEntityManager(); + + static private final CriteriaBuilder builder = factory.getCriteriaBuilder(); + /** + * @param args unused + */ + public static void main( String[] args ) { + + final CriteriaQuery<StudyCourse> criteria = builder.createQuery(StudyCourse.class); + final Root<StudyCourse> studyCourseRoot = criteria.from(StudyCourse.class); + criteria.select( studyCourseRoot ); + criteria.where( builder.like( studyCourseRoot.get(StudyCourse_.shortName), "C%" ) ); + final List<StudyCourse> studyCourses = entityManager.createQuery( criteria ).getResultList(); + + studyCourses.stream().map(s -> "Read '" + s + "'").forEach(System.out::println); + + factory.close(); + } +} \ No newline at end of file diff --git a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/JpqlReadAllStudyCourseRecords.java b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/JpqlReadAllStudyCourseRecords.java new file mode 100644 index 0000000000000000000000000000000000000000..da22e36b9c0796c44538fe4b589d673997ac9a92 --- /dev/null +++ b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/JpqlReadAllStudyCourseRecords.java @@ -0,0 +1,35 @@ +package de.hdm_stuttgart.mi.sda1; + +import de.hdm_stuttgart.mi.sda1.model.StudyCourse; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.Query; + +/** + * Read a {@link StudyCourse} by its primary key value. + */ +public class JpqlReadAllStudyCourseRecords { + + static private final EntityManagerFactory factory = Persistence.createEntityManagerFactory( + "strategy_none"); + + static private final EntityManager entityManager = factory.createEntityManager(); + /** + * @param args unused + */ + public static void main( String[] args ) { + final Query queryRecords = entityManager.createQuery( + "SELECT S.fullName, S.shortName FROM StudyCourse AS S"); + + queryRecords.getResultList().stream(). + map(r -> { + final Object[] record = (Object[]) r; + return record[0] + " (" + record[1] + ")"; + }). + forEach(System.out::println); + + factory.close(); + } +} \ No newline at end of file diff --git a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/JpqlReadAllStudyCourses.java b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/JpqlReadAllStudyCourses.java new file mode 100644 index 0000000000000000000000000000000000000000..9799ca5d9695ccf2ce0fc195f2c01edc814db180 --- /dev/null +++ b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/JpqlReadAllStudyCourses.java @@ -0,0 +1,51 @@ +package de.hdm_stuttgart.mi.sda1; + +import de.hdm_stuttgart.mi.sda1.model.StudyCourse; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.Query; + +/** + * Read a {@link StudyCourse} by its primary key value. + */ +public class JpqlReadAllStudyCourses { + + static private final Logger log = LogManager.getLogger(JpqlReadAllStudyCourses.class); + + static private final EntityManagerFactory factory = Persistence.createEntityManagerFactory( + "strategy_none"); + + static private final EntityManager entityManager = factory.createEntityManager(); + /** + * @param args unused + */ + public static void main( String[] args ) { + + { + log.info("Straight JPQL"); + final Query query = entityManager.createQuery( + "SELECT S FROM StudyCourse AS S WHERE S.shortName like 'C%'"); + + query.getResultList(). + stream().map(s -> "Read '" + s + "'").forEach(System.out::println); + } + { + log.info("JPQL using parameter"); + final Query query = entityManager.createQuery( + "SELECT S FROM StudyCourse AS S WHERE S.shortName like :pattern"); + query.setParameter("pattern", "C%"); + + query.getResultList(). + stream(). + map(s -> "Read '" + s + "'"). + forEach(System.out::println); + } + + + factory.close(); + } +} \ No newline at end of file diff --git a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/JqlTypeViolation.java b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/JqlTypeViolation.java new file mode 100644 index 0000000000000000000000000000000000000000..68fe84aca00cbe319c16076480d0b8aac2466ee2 --- /dev/null +++ b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/JqlTypeViolation.java @@ -0,0 +1,34 @@ +package de.hdm_stuttgart.mi.sda1; + +import de.hdm_stuttgart.mi.sda1.model.StudyCourse; + +import javax.persistence.*; +import java.util.List; + +/** + * Database / OO Model type violation. + */ +public class JqlTypeViolation { + + static private final EntityManagerFactory factory = Persistence.createEntityManagerFactory( + "strategy_none"); + + static private final EntityManager entityManager = factory.createEntityManager(); + + /** + * @param args unused + */ + public static void main( String[] args ) { + + final Query query = entityManager.createQuery("SELECT S.shortName FROM StudyCourse AS S"); + + final List<StudyCourse> studyCourses = query.getResultList(); + + try { + studyCourses.stream().map(s -> "Read '" + s + "'"). + forEach(System.out::println); + } finally { + factory.close(); + } + } +} \ No newline at end of file diff --git a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/QuerydslReadLikeCstudyCourses.java b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/QuerydslReadLikeCstudyCourses.java new file mode 100644 index 0000000000000000000000000000000000000000..eb4ea84b1adac9f9d080dbe2537a438b2971cdf9 --- /dev/null +++ b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/QuerydslReadLikeCstudyCourses.java @@ -0,0 +1,44 @@ +package de.hdm_stuttgart.mi.sda1; + +import com.mysema.query.jpa.impl.JPAQuery; +import de.hdm_stuttgart.mi.sda1.model.QStudyCourse; +import de.hdm_stuttgart.mi.sda1.model.StudyCourse; + +import javax.persistence.*; +import java.util.List; + +/** + * Read a {@link StudyCourse} by its primary key value. + */ +public class QuerydslReadLikeCstudyCourses { + + static private final EntityManagerFactory factory = Persistence.createEntityManagerFactory( + "strategy_none"); + + static private final EntityManager entityManager = factory.createEntityManager(); + /** + * @param args unused + */ + public static void main( String[] args ) { + + final QStudyCourse qStudyCourse = QStudyCourse.studyCourse; + + { + final List<StudyCourse> studyCourses = + new JPAQuery(entityManager). + from(qStudyCourse). + list(qStudyCourse); + studyCourses.stream().map(s -> "All: Read '" + s + "'").forEach(System.out::println); + } + new JPAQuery(entityManager). + from(qStudyCourse). + where(qStudyCourse.shortName.like("C%")). + list(qStudyCourse). + stream(). + map(s -> "Like C%: Read '" + s + "'"). + forEach(System.out::println); + + // See http://stackoverflow.com/questions/21645516/program-using-hibernate-does-not-terminate + factory.close(); + } +} \ No newline at end of file diff --git a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/ReadStudyCourseById.java b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/ReadStudyCourseById.java new file mode 100644 index 0000000000000000000000000000000000000000..f1b64449bbb29820de449a0e4f175a4bef5d50bb --- /dev/null +++ b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/ReadStudyCourseById.java @@ -0,0 +1,31 @@ +package de.hdm_stuttgart.mi.sda1; + +import de.hdm_stuttgart.mi.sda1.model.StudyCourse; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; + +/** + * Read a {@link StudyCourse} by its primary key value. + */ +public class ReadStudyCourseById { + + static private final EntityManagerFactory factory = Persistence.createEntityManagerFactory( + "strategy_none"); + + static private final EntityManager entityManager = factory.createEntityManager(); + + /** + * @param args unused + */ + public static void main( String[] args ) { + + final StudyCourse studyCourse = entityManager.find(StudyCourse.class, "CSM"); + + System.out.println("Read '" + studyCourse + "'"); + + // See http://stackoverflow.com/questions/21645516/program-using-hibernate-does-not-terminate + factory.close(); + } +} \ No newline at end of file diff --git a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/ReadStudyCourseShortName.java b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/ReadStudyCourseShortName.java new file mode 100644 index 0000000000000000000000000000000000000000..c26e2d1cea623238b90aac14f58e6568408b6b29 --- /dev/null +++ b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/ReadStudyCourseShortName.java @@ -0,0 +1,32 @@ +package de.hdm_stuttgart.mi.sda1; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.List; + +/** + * Database / OO Model type violation. + */ +public class ReadStudyCourseShortName { + + static private final EntityManagerFactory factory = Persistence.createEntityManagerFactory( + "strategy_none"); + + static private final EntityManager entityManager = factory.createEntityManager(); + /** + * @param args unused + */ + public static void main( String[] args ) { + + final List<String> studyCourseShortNames = + entityManager.createQuery("SELECT S.shortName FROM StudyCourse AS S"). + getResultList(); + + studyCourseShortNames.stream(). + map(s -> "Read '" + s + "'"). + forEach(System.out::println); + + factory.close(); + } +} \ No newline at end of file diff --git a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/UpdateStudyCourseById.java b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/UpdateStudyCourseById.java new file mode 100644 index 0000000000000000000000000000000000000000..c8258f79f35da17ecccc66a8a81927e4c26a11b5 --- /dev/null +++ b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/UpdateStudyCourseById.java @@ -0,0 +1,37 @@ +package de.hdm_stuttgart.mi.sda1; + +import de.hdm_stuttgart.mi.sda1.model.StudyCourse; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.EntityTransaction; +import javax.persistence.Persistence; + +/** + * Read a {@link StudyCourse} by its primary key value. + */ +public class UpdateStudyCourseById { + + static private final EntityManagerFactory factory = Persistence.createEntityManagerFactory( + "strategy_none"); + + static private final EntityManager entityManager = factory.createEntityManager(); + + /** + * @param args unused + */ + public static void main( String[] args ) { + + final StudyCourse csm = entityManager.find(StudyCourse.class, "CSM"); + + final EntityTransaction tx = entityManager.getTransaction(); + tx.begin(); + csm.setFullName("Computerwissenschaft und Medien"); + tx.commit(); + + System.out.println("After renaming: '" + csm + "'"); + + // See http://stackoverflow.com/questions/21645516/program-using-hibernate-does-not-terminate + factory.close(); + } +} \ No newline at end of file diff --git a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/model/StudyCourse.java b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/model/StudyCourse.java index 82a082fb475fa9ed96eccc223cd1eba2339d4068..30f1eba6137e54efbd3e73ffcb1d2487335a26a0 100644 --- a/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/model/StudyCourse.java +++ b/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/model/StudyCourse.java @@ -19,7 +19,7 @@ public class StudyCourse { @OneToMany(mappedBy = "studyCourse", cascade = CascadeType.ALL) - List<Student> students = new Vector<>(); + final List<Student> students = new Vector<>(); protected StudyCourse(){} diff --git a/Doc/Sda1/jpaintro.xml b/Doc/Sda1/jpaintro.xml index 0f7e1367dea163c30e5e7563d0e5d3ca67a62ac7..390993ef6f17db2c2a332158dce2de77edea681e 100644 --- a/Doc/Sda1/jpaintro.xml +++ b/Doc/Sda1/jpaintro.xml @@ -1363,7 +1363,8 @@ where studycours0_.shortName like <emphasis role="red">?</emphasis> escape '!' < <glossdef> <programlisting language="none">CREATE TABLE StudyCourse ( - id bigint(20) NOT NULL <emphasis role="red">GENERATED ALWAYS AS IDENTITY</emphasis>, + id bigint(20) NOT NULL + <emphasis role="red">GENERATED ALWAYS AS IDENTITY</emphasis>, PRIMARY KEY (id),... )</programlisting> </glossdef> </glossentry> @@ -1390,61 +1391,186 @@ VALUES('Mobile Media ', 'MMB');</programlisting> <informaltable border="0"> <tr> <td valign="top"><programlisting language="none">@Entity public class StudyCourse { - @Id @GeneratedValue(strategy = <emphasis role="red">GenerationType.IDENTITY</emphasis>) + @Id <co linkends="sda1_jpaintro_fig_generatedIdentity-1" + xml:id="sda1_jpaintro_fig_generatedIdentity-1-co"/> + @GeneratedValue <co linkends="sda1_jpaintro_fig_generatedIdentity-2" + xml:id="sda1_jpaintro_fig_generatedIdentity-2-co"/> + (strategy=<emphasis role="red">GenerationType.IDENTITY</emphasis>) <emphasis role="red">Long id</emphasis>; - @Column(length = 3, nullable = false, unique = true) - private String shortName; - - @Column(length = 150, nullable = false, unique = true) - private String fullName; + @Column(... unique = true <co + linkends="sda1_jpaintro_fig_generatedIdentity-3" + xml:id="sda1_jpaintro_fig_generatedIdentity-3-co"/>) + private String shortName; + + @Column(...unique = true <co + linkends="sda1_jpaintro_fig_generatedIdentity-4" + xml:id="sda1_jpaintro_fig_generatedIdentity-4-co"/>) + private String fullName; ... @Override public String toString() { - return fullName + "(" + shortName + ", <emphasis role="red">id=" + id</emphasis> + ")"; + return fullName + "(" + shortName + + ", <emphasis role="red">id=" + id</emphasis> + ")"; }}</programlisting></td> <td valign="top"><screen>CREATE TABLE StudyCourse ( - id bigint(20) NOT NULL AUTO_INCREMENT, - fullName varchar(150) DEFAULT NULL, + id bigint(20) NOT NULL + AUTO_INCREMENT <coref linkend="sda1_jpaintro_fig_generatedIdentity-2-co"/>, + fullName varchar(150) NOT NULL, shortName varchar(3) NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY ... (fullName), - UNIQUE KEY ... (shortName) + PRIMARY KEY (id), <coref linkend="sda1_jpaintro_fig_generatedIdentity-1-co"/> + UNIQUE KEY ... (fullName), <coref + linkend="sda1_jpaintro_fig_generatedIdentity-4-co"/> + UNIQUE KEY ... (shortName) <coref + linkend="sda1_jpaintro_fig_generatedIdentity-3-co"/> )</screen></td> </tr> </informaltable> </figure> + <calloutlist> + <callout arearefs="sda1_jpaintro_fig_generatedIdentity-1-co" + xml:id="sda1_jpaintro_fig_generatedIdentity-1"> + <para>Defining the primary key.</para> + </callout> + + <callout arearefs="sda1_jpaintro_fig_generatedIdentity-2-co" + xml:id="sda1_jpaintro_fig_generatedIdentity-2"> + <para>Database auto generated value.</para> + </callout> + + <callout arearefs="sda1_jpaintro_fig_generatedIdentity-3-co" + xml:id="sda1_jpaintro_fig_generatedIdentity-3"> + <para>First business key.</para> + </callout> + + <callout arearefs="sda1_jpaintro_fig_generatedIdentity-4-co" + xml:id="sda1_jpaintro_fig_generatedIdentity-4"> + <para>Second business key.</para> + </callout> + </calloutlist> + <figure xml:id="sda1_jpaintro_fig_createNewStudyCourse"> - <title><classname>StudyCourse</classname> creation</title> + <title><classname + xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/model/StudyCourse.java">StudyCourse</classname> + creation</title> <informaltable border="0"> <tr> - <td valign="top"><programlisting language="none">@Entity public class StudyCourse { - @Id @GeneratedValue(strategy = <emphasis role="red">GenerationType.IDENTITY</emphasis>) - <emphasis role="red">Long id</emphasis>; - @Column(length = 3, nullable = false, unique = true) - private String shortName; + <td valign="top"><programlisting language="none">final StudyCourse csm = + new StudyCourse( + "CSM", "Computer Science and Media"); + +log.info(csm); +tx.begin(); + entityManager.persist(csm); +tx.commit(); +log.info(csm);</programlisting></td> + + <td valign="top"><screen>13:04:33,027 ...Computer Science ... + (CSM, <emphasis role="red">id=null</emphasis>) +... + insert ...StudyCourse ... +13:04:33,068 ...Computer Science ... + (CSM, <emphasis role="red">id=1</emphasis>)</screen></td> + </tr> + </informaltable> + </figure> - @Column(length = 150, nullable = false, unique = true) - private String fullName; + <figure xml:id="sda1_jpaintro_fig_entityStudent"> + <title>Entity <classname + xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/model/Student.java">Student</classname></title> + + <informaltable border="0"> + <tr> + <td valign="top"><programlisting language="none">@Entity public class Student { + @Id @GeneratedValue(...) Long id; + + @Column(... unique = true) + private String name; + + <emphasis role="red">@ManyToOne</emphasis> + StudyCourse studyCourse; + + public Student(final String name) + {this.name = name;} +}</programlisting></td> + + <td valign="top"><programlisting language="none">@Entity class StudyCourse { ... - @Override - public String toString() { - return fullName + "(" + shortName + ", <emphasis role="red">id=" + id</emphasis> + ")"; - }}</programlisting></td> - <td valign="top"><screen>CREATE TABLE StudyCourse ( - id bigint(20) NOT NULL AUTO_INCREMENT, - fullName varchar(150) DEFAULT NULL, - shortName varchar(3) NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY ... (fullName), - UNIQUE KEY ... (shortName) -)</screen></td> + <emphasis role="red">@OneToMany</emphasis>( + <emphasis role="red">mappedBy = "studyCourse"</emphasis>) + final List<Student> students + = new Vector<>(); + +... +}</programlisting></td> + </tr> + </informaltable> + </figure> + + <figure xml:id="sda1_jpaintro_fig_DDL_Student"> + <title>Database schema</title> + + <programlisting language="none">CREATE TABLE Student ( + id bigint(20) NOT NULL <emphasis role="red">AUTO_INCREMENT</emphasis>, + name varchar(30) NOT NULL, + studyCourse_id bigint(20) DEFAULT NULL, + <emphasis role="red">PRIMARY KEY (id)</emphasis>, + <emphasis role="red">UNIQUE KEY (name)</emphasis>, + KEY ... (studyCourse_id), + <emphasis role="red">FOREIGN KEY (studyCourse_id)</emphasis> REFERENCES StudyCourse (id) +)</programlisting> + </figure> + + <figure xml:id="sda1_jpaintro_fig_studentEnroll"> + <title>Providing enrollment</title> + + <informaltable border="0"> + <tr> + <td valign="top"><programlisting language="none">@Entity public class Student { +... + @ManyToOne + StudyCourse studyCourse; + + public void enroll( + final StudyCourse studyCourse) { + studyCourse.add(this); + this.studyCourse = studyCourse; + } +... +}</programlisting></td> + + <td valign="top"><programlisting language="none">@Entity +public class StudyCourse { + + @OneToMany( + mappedBy = "studyCourse", + <emphasis role="red">cascade = CascadeType.ALL</emphasis>) + final List<Student> students + = new Vector<>(); + + void add(final Student student){ + students.add(student); + } ...}</programlisting></td> </tr> </informaltable> </figure> + + <figure xml:id="sda1_jpaintro_fig_studentsToStudyCourse"> + <title><classname + xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Doc/Sda1/Ref/JpaIntro/P/StudyCourse_surrogate/src/main/java/de/hdm_stuttgart/mi/sda1/CreateUniversity.java">CreateUniversity</classname></title> + + <programlisting language="java"> final List<Student> students = new Vector<>(); + students.add(new Student("Jill Evans")); + students.add(new Student("Peter Brown")); + + StudyCourse csm = studyCourses.get(0); + tx.begin(); + students.forEach(s -> s.enroll(csm)); + tx.commit();</programlisting> + </figure> </section> <section xml:id="sda1_jpaintro_sectpersistLectureInst">