Download - Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.

Transcript
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