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&lt;Student&gt; students      
+    = new Vector&lt;&gt;();
+
+...
+}</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&lt;Student&gt; students
+    = new Vector&lt;&gt;();
+
+  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&lt;Student&gt; students = new Vector&lt;&gt;();
+    students.add(new Student("Jill Evans"));
+    students.add(new Student("Peter Brown"));
+
+    StudyCourse csm = studyCourses.get(0);
+    tx.begin();
+      students.forEach(s -&gt; s.enroll(csm));
+    tx.commit();</programlisting>
+    </figure>
   </section>
 
   <section xml:id="sda1_jpaintro_sectpersistLectureInst">