Persistente Domänenmodelle mit JPA 2.0 und Bean Validation

Slides:



Advertisements
Ähnliche Präsentationen
Object Relational Mapping
Advertisements

Object Relational Mapping (ORM). Objektmodell - Datenbankmodell.
Simon Martinelli – JSR 303 Bean validation Simon Martinelli –
Persistente Domänenmodelle mit JPA 2.0 und Bean Validation
Objektrelationales Mapping mit JPA
Objektrelationales Mapping mit JPA Advanced Topics Jonas Bandi Simon Martinelli.
Klassen - Verkettete Liste -
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Transaction Synchronization for XML Data in Client Server Web Applications Stefan Böttcher & Adelhard Türling Universität Paderborn.
JPQL Java Persistence Query Language
Anwendungen des OODM auf die ADB / NDB
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Fakultät für informatik informatik 12 technische universität dortmund Specifications Peter Marwedel TU Dortmund, Informatik 12 Graphics: © Alexandra Nolte,
Design by Contract with JML - Teil 2
Objektrelationales Mapping mit JPA Working with Persistent Objects Jonas Bandi Simon Martinelli.
Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.
Objektrelationales Mapping mit JPA Entity Mapping Jonas Bandi Simon Martinelli.
Objektrelationales Mapping mit JPA Getting Started Jonas Bandi Simon Martinelli.
Zusammenfassung / Ausblick Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Objektrelationales Mapping mit JPA Ausblick Jonas Bandi Simon Martinelli.
Binäre Bäume Richard Göbel.
Java: Dynamische Datentypen
Listen Richard Göbel.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
M a r c – o l i v e r p a h l Die ObjektOrientierte Mühle Das Beispiel soll noch einmal das Konzept der Objektorientiertheit erläutern. Dabei werden außerdem.
We have a magnetic field that it is very similar to the one of a dipole. Well in reality this is true close to the surface if we go far away enough it.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 9 IO – Streams in Java Sommersemester 2003 Lars Bernard.
Listen Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang
Programmiermethodik SS2010 © 2010 Albert Zündorf, University of Kassel 1 Gesamtvorgehen 1. Textuelle Szenarios 2. Objektdiagramme 3. Klassendiagramm 4.
Entwurfsmuster – Iterator
F açade P attern By Nicolas Lanquetin. Façade Pattern Structural Pattern Bietet ein gemeinsames Interface, anstatt vieler Interfaces eines Subsystems.
Modulare Programmierung
04 - Actions Actions Actions 2 Motivation In verschiedenen Swing-Komponenten werden ausgelöste Aktionen durch ActionListener behandelt. Häufig werden.
DVG Verkettete Listen Verkettete Listen. DVG Verkettete Listen 2 Primitive Datentypen Vorteile: –werden direkt vom Prozessor unterstützt.
Einführung in die Programmierung Datensammlung
Einfach verkettete Listen (OOP)
Die Persistenzschicht
Persistente Domänenmodelle mit JPA 2.0 und Bean Validation
Working With Persistent Objects
Smart 2 Unit 2 What a week! – That’s why Barker barked!
Objectives 1.Say what kind of house you live in 2.Use adjectives in the Dative case 3.Describe your house and its location.
Medien zwischen Technologie und Gesellschaft Dozent: Herr Prof. Dr. Manfred Thaller SS 13 Referent: Christian Braun.
VS one Veranstalter: VSone Feb. 08 Folie 1 Copyright by XML-Serialisierung zur Persistierung von Objekten Thomas Schissler
Institut AIFB, Universität Karlsruhe (TH) Forschungsuniversität gegründet 1825 Towards Automatic Composition of Processes based on Semantic.
OO implementieren Teil IV Objekte erzeugen. © René ProbstModul 226IV - 2 Von der Klasse zum Objekt Plan Bau Objekt Klasse Instanzierung Objekt Das Objekt.
Objektrelationales Mapping mit JPA 2.0
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Gameplay Systems I Softwaretechnologie II (Teil 2): Simulation und 3D Programmierung SS 2012 Prof. Dr. phil. Manfred Thaller Referent: Christian Weitz.
Bean Validation JSR-303 Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Advanced Topics Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Architecture Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Entity Mapping Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Advanced Mapping Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Persistente Domänenmodelle mit JPA 2.0 und Bean Validation
Objektrelationales Mapping mit JPA 2.0
Parallel Programming Thread Synchronization. Heute 1. Lösung zu Assignment 2 2. Erstellen und Starten von Threads in Java 3. Das synchronized Schlüsselwort.
Abteilung für Telekooperation Übung Softwareentwicklung 2 für Wirtschaftsinformatik Dr. Wieland Schwinger
Getting Started Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Algorithmen und Datenstrukturen Übungsmodul 6
Equals, Hashcode und CompareTo Micha Kessler
Past Perfect Tense.
Design Patterns Ein Muster (pattern) ist eine Idee, die sich in einem praktischen Kontext als nützlich erwiesen hat und dies auch in anderen sein wird.
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Torque in Turbine Team 3 Alexander Mittermair Michael Wesinger.
Launch ON Global.vi System ID object name classname Services to suscribe Observer Control Ref vi-path Service name Step 1 : Objects register to the Global.vi´s,
NATURAL & INDUSTRIAL FOOD. Natural & Industrial Food2 TIMELINE & ORGANIZATION  2 groups of 11 pupils  2 lessons per week (120 min)  4 lessons in each.
Beispielanwendung von Java Threads
Page 1 XXX21/08/2014 Implemented by Benutzen Sie diese Titelfolie für Programme und Projekte im Ausland. Setzen Sie das „einheitliche Logo der Zusammenarbeit“
Your Logo Presentation Title Presentation Subtitle.
 Präsentation transkript:

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

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:

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.

Eine Parent-Child Beziehung @Entity public class Employee { … @ManyToOne private Department department; Mapping der many-to-one Beziehung 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 @Entity public class Department { … @OneToMany @JoinColumn (name=”department_id”) private Set<Employee> employees = new HashSet<Employee>(); @Entity public class Department { … @OneToMany (mappedBy = “department“) private Set<Order> employees = new HashSet<Employee>(); Mapping der bidirektionalen Beziehung JPA muss wissen, dass nur ein Foreign-Key für beide Richtungen existiert.

Collection Types Richtung Kardinalität Unidirektional Bidirektional One-to-one Many-to-one One-to-many many-to-many Source Target Employee Address Employee Project 1 1 Employee Address * 1 Employee Department 1 * Employee Phone * * Employee Project

one-to-one, unidirektional Employee @OneToOne private Address address; entspricht: @JoinColumn(name="address_id", referencedColumnName = "id") (JPA2 unterstützt auch one-to-one mit einer zusätzlichen Zwischentabelle)

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

one-to-many, bidirektional Phone @ManyToOne(optional = false) private Employee employee; Employee @OneToMany(mappedBy = "employee") private Collection<Phone> phones;

many-to-many, bidirektional Employee @ManyToMany(mappedBy = "employees") private Collection<Project> projects; Project @ManyToMany private Collection<Employee> employees;

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

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 @OneToMany private Set<Employee> employees = new HashSet<Employee>(); JPA 2 spezifiziert die unidirektionale one-to-many Beziehung ohne Zwischentabelle. @OneToMany @JoinColumn (name=”department_id”) private Set<Employee> employees = new HashSet<Employee>();

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);

Bidirektionale Beziehungen Best Practice: Convenience Methoden auf den Entities: @Entity public class Department { … @OneToMany private List<Employee> employees = new ArrayList<Employee>(); 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.

Verwendung von Collections java.util.Set Eindeutig (Object.equals()) @OneToMany private Set<Phone> phones; java.util.List geordnet, kann sortiert werden @OneToMany @OrderBy("phonenumber ASC") private List<Phone> phones; java.util.Map Key/Value Paare @OneToMany @MapKey(name = "phonenumber") private Map<String, Phone> phones; JPA 2: Persistenter Index @OneToMany @OrderColumn(name="index") private List<Phone> phones;

Lazy- und Eager-Loading Beziehungen werden transparent (nach)geladen: EntityManager em = ... Department foreignAffairs = em.find(Department.class, 123); foreignAffairs.getEmployees().iterator().next(); 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. @OneToMany(fetch = FetchType.EAGER) private Set<Phone> phones;

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(); Jede Entity hat einen eigenen, unabhängigen Lifecycle! IllegalStateException wenn vergessen wird, eine assoziierte Entity zu persistieren. for (Employee empl : taxes.getEmployees()){ em.remove(empl); } em.remove(taxes); em.flush(); It is still possible to violate a NOT NULL constraint on a foreign key column by deleting objects in the wrong order, e.g. if you delete the parent, but forget to delete the children. Delete all entities individually

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

Orphan Deletion Child wird nicht gelöscht! 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 Orphans @OneToMany(cascade=ALL, mappedBy=”customer”, orphanRemoval=true) public Set<Order> getOrders() { return orders; }