Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

10
Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli

Transcript of Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

Page 1: Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

Objektrelationales Mapping mit JPA

Advanced Mapping

Jonas BandiSimon Martinelli

Page 2: Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

• Komposition: Mutterobjekt mit eingebetteten Objekten

• Eingebettete Objekte haben keine eigene Identität

• Mutterobjekt und eingebettete sind in derselben Tabelle abgelegt

Embedded Objects

-id : int-name : String-salary : long

Employee

-id : int-street : String-city : String-state : String-zip : String

Address

0..1

EMPLOYEE

PK ID

NAME SALARY STREET CITY STATE ZIP

Page 3: Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

Embedded Objects, Beispiel

@Embeddable

public class Address {

private String street;

private String city;

private String state;

private String zip;

// ...

}

@Entity

public class Employee {

@Id private int id;

private String name;

private long salary;

@Embedded private Address address;

// ....

}

Page 4: Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

Zusammengesetzte Primärschlüssel• Es wird eine spezielle ID-Klasse benötigt. Beispiel:

public class EmployeeId implements Serializable { protected String country; protected int id;

@IdClass( EmployeeId.class ) // Variante 1@Entity public class Employee { @Id protected String country; @Id protected int id;

@Entity public class Document { // Variante 2 @EmbeddedId public EmployeeId id;

Page 5: Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

Mehrere Tabellen pro Entity

• Gelegentlich wird eine Entity in der Datenbank in mehrere Tabellen modelliert oder muss umgekehrt aus mehreren Tabellen zusammengesetzt werden.

• Eine Entity kann beliebig viele Sekundärtabellen haben:@Entity

@Table( name = "Employee" )

@SecondaryTable( name = "EmployeeExt",

pkJoinColumns = {

@PrimaryKeyJoinColumn(name="idRef",

referencedColumnName = "id") } )

public class Employee { ...}

Page 6: Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

Vererbung

• Vererbungshierarchien können problemlos verwendet und abgebildet werden.

• Klassen können abstrakt oder konkret sein.

• Alle Klassen in der Vererbungshierarchie müssen den Primärschlüssel der Basisklasse verwenden (erben).

• Es gibt vier Mappingstrategien auf die Datenbank:

• Eine einzige Tabelle für die gesamte Verbungshierarchie

• Eine Tabelle für jede konkrete Klasse

• Eine Tabelle für jede Klasse

• Mapped Superclass

Page 7: Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

SINGLE_TABLE

@Entity@Inheritance public class Project

@Entity public class DesignProject extends Project

@Entity public class QualityProject extends Project

Project

-id : int-name : String

DesignProject QualityProject

PROJECT

ID

DTYPE (O) NAME (O)

Page 8: Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

JOINED

@Entity @Inheritance(strategy=InheritanceType.JOINED)public class Project

@Entity public class DesignProject extends Project

@Entity public class QualityProject extends Project

PROJECT

ID

DTYPE (O) NAME (O)

QUALITYPROJECT

ID (FK)DESIGNPROJECT

ID (FK)

Project

-id : int-name : String

DesignProject QualityProject

Page 9: Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

TABLE_PER_CLASS

@Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)public class Project

@Entity public class DesignProject extends Project

@Entity public class QualityProject extends Project

DesignProject

name (O)

QualityProject

name (O)

Project

-id : int-name : String

DesignProject QualityProject

Page 10: Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

MAPPED_SUPERCLASS

BaseEntity

@MappedSuperclasspublic abstract class BaseEntity {@Id@GeneratedValue(strategy = GenerationType.SEQUENCE)protected Integer id;protected Integer version;protected Timestamp createdAt;protected String createdFrom;protected Timestamp updatedAt;protected String updatedFrom;

Phone

@Entitypublic class Phone extends BaseEntity

-phonenumber : String-type : String

Phone

-id : Integer-createdAt : Date-createdFrom : String-updatedAt : String-updatedFrom : String-version : Integer

BaseEntity