Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Beziehungen Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

Ähnliche Präsentationen


Präsentation zum Thema: "Beziehungen Persistente Domänenmodelle mit JPA 2.0 und Bean Validation."—  Präsentation transkript:

1 Beziehungen Persistente Domänenmodelle mit JPA 2.0 und Bean Validation

2 Eine Parent-Child Beziehung Wie sieht das Klassen-Modell aus? Employee hat eine Referenz auf Department Department hat eine Collection von Employee Referenzen Beides: Bidirektionale Beziehung Unabhängig davon ist das zugrundeliegende DB-Schema:

3 Eine Parent-Child Beziehung Mapping des Klassenmodells auf das DB-Schema mittels JPA: Metadata ist erforderlich. Je nach Klassenmodell wird entweder eine many-to- one Beziehung oder eine one-to-many Beziehung gemappt Falls beide Richtungen gemappt werden sollen, so muss definiert werden, dass für beide derselbe Foreign-Key zugrunde liegt.

4 Eine Parent-Child public class Employee { private Department department; public class Department (name=department_id) private Set employees = new HashSet (); public class Department { (mappedBy = department) private Set employees = new HashSet (); … Mapping der one-to-many Beziehung Field/Property muss ein Interface sein Achtung: – Unidirektionales one-to-many ohne Beziehungstabelle wird erst ab JPA2 unterstützt Mapping der many-to-one Beziehung Mapping der bidirektionalen Beziehung JPA muss wissen, dass nur ein Foreign-Key für beide Richtungen existiert.

5 Collection Types Richtung – Unidirektional – Bidirektional Kardinalität – One-to-one – Many-to-one – One-to-many – many-to-many EmployeeProject EmployeeAddress SourceTarget EmployeeDepartment *1 EmployeeProject ** EmployeeAddress 11 EmployeePhone 1*

6 one-to-one, unidirektional private Address referencedColumnName = "id") private Address address; (JPA2 unterstützt auch one-to-one mit einer zusätzlichen Zwischentabelle)

7 many-to-one, unidirektional private Department department; (JPA2 unterstützt auch many-to-one mit einer zusätzlichen Zwischentabelle)

8 one-to-many, bidirektional = false) private Employee employee; = "employee") private Collection phones;

9 many-to-many, bidirektional = "employees") private Collection projects; private Collection employees;

10 Many-To-Many Beziehungen If you think that two objects share a simple many-to-many relationship, you haven't looked closely enough at the domain. There is a third object waiting to be discovered with attributes and a life cycle all its own. - Dierk König Oft sind weitere Daten auf der Zwischentabelle nötig Üblicherweise mappt man dann die Zwischentabelle auf eine eigene Entity

11 one-to-many, unidirektional Bei einer unidirektionalen one-to-many Beziehungen fehlt das mappedBy Element und das Target hat keine Rückbeziehung JPA verwendet in diesen Fällen ebenfalls eine Beziehungstabelle JPA 2 spezifiziert die unidirektionale one-to-many Beziehung (name=department_id) private Set employees = new HashSet private Set employees = new HashSet ();

12 Bidirektionale Beziehungen JPA verändert die Java-Semantik nicht! D.h. der korrekte Unterhalt von bidirektionalen Beziehungen ist Sache der Applikation! Department taxes = new Department(); Employee john = new Employee(); taxes.getEmployees().add(john); john.setDepartment(taxes);

13 Bidirektionale Beziehungen Best Practice: Convenience Methoden auf den public class Department { private List employees = new ArrayList (); public void addEmployee(Employee employee){ if (employee == null) throw new IllegalArgumentException(Null employee); if (employee.getDepartment() != null) employee.getDepartment().getEmployees().remove(employee); getEmployees().add(employee); employee.setDepartment(this); } … } Analog: removeEmployee() sowie Methoden auf Employee.

14 Verwendung von Collections java.util.Set – Eindeutig ( Object.equals() ) private Set phones; java.util.List – geordnet, kann sortiert ASC") private List phones; java.util.Map – Key/Value = "phonenumber") private Map phones; JPA 2: private List phones;

15 Lazy- und Eager-Loading Default bei one-to-one und many-to-one –FetchType.EAGER Default bei one-to-many und many-to-many –FetchType.LAZY Defaultverhalten kann übersteuert werden. z.B. = FetchType.EAGER) private Set phones; EntityManager em =... Department foreignAffairs = em.find(Department.class, 123); foreignAffairs.getEmployees().iterator().next(); Beziehungen werden transparent (nach)geladen:

16 Speichern und Löschen von Beziehungen Department taxes = new Department(); Employee john = new Employee(); taxes.addEmployee(john); Employee jane = new Employee(); taxes.addEmployee(jane); em.persist(taxes); em.persist(john); em.persist(jane); em.flush(); for (Employee empl : taxes.getEmployees()){ em.remove(empl); } em.remove(taxes); em.flush(); Jede Entity hat einen eigenen, unabhängigen Lifecycle! IllegalStateException wenn vergessen wird, eine assoziierte Entity zu persistieren. Delete all entities individually

17 Transitive Persistenz Persistenz wird von JPA propagiert auf assoziierte (mappedBy = department, cascade = CascadeType.ALL) private Set employees = new HashSet (); Department taxes = new Department(); Employee john = new Employee(); taxes.addEmployee(john); Employee jane = new Employee(); taxes.addEmployee(jane); em.persist(taxes); em.flush(); em.delete(taxes); em.flush(); Kaskadierung wird auf der Assoziation konfiguriert Speichern eines Parents speichert auch alle Kinder Löschen eines Parents löscht auch alle Kinder. CascadeType {ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH};

18 Orphan Deletion Phone phone1 = … Employee john = em.find(Employee.class, 123); john.getPhones().remove(phone1); em.flush(); Child wird nicht gelöscht! Entfernen eines Kindes aus der Collection des Parents setzt nur den Foreign Key auf der Kind-Tabelle auf NULL. – FK Constraint Verletzung möglich – Das Kind ist nun orphaned In JPA 1 muss das Löschen von Orphans explizit in der Applikation erfolgen. JPA 2 unterstützt das automatische Löschen von mappedBy=customer, orphanRemoval=true) public Set getOrders() { return orders; }


Herunterladen ppt "Beziehungen Persistente Domänenmodelle mit JPA 2.0 und Bean Validation."

Ähnliche Präsentationen


Google-Anzeigen