Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.
-
Upload
isold-zibell -
Category
Documents
-
view
105 -
download
1
Transcript of Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.
Objektrelationales Mapping mit JPA
Advanced Mapping
Jonas BandiSimon 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
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;
// ....
}
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;
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 { ...}
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
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)
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
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
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