PDF Dokument

Werbung
Enterprise JavaBeans
Überblick
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Überblick Java EE 5 und Komponententechnologien
Einführung Java EE 5 Plattform
Enterprise JavaBeans Architektur
Ressourcen Management und Primäre Services
Java Persistence: Entity Manager
Objekt-Relationales Mapping
Entity Bean Beziehungen
Find- und Select Methoden
Value Objects
Session Facade
Ergänzungen zu Entity Beans 2
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
219
Enterprise JavaBeans
6. Objekt-Relationales Mapping
6.1
6.2
6.3
6.4
Programmiermodell
Einfaches Mapping
Primärschlüssel
Mapping von Properties
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
220
1
6. Objekt-Relationales Mapping
6.1 Programmiermodell
„
Entity Bean
import javax.persistence.*;
@Entity
public class Customer implement java.io.Serializable {
private long id;
private String firstName;
private String lastName;
@Id
public int getId(() { return id; }
public void setId(int id) { this.id = id; }
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) {this.firstName=firstName;}
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName=lastName; }
}
‰
Getter- und Setter-Methoden bestimmen persistente Felder
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
221
6. Objekt-Relationales Mapping
6.1 Programmiermodell
„
Zugehörige Tabelle
‰
DDL Code
create table Customer(
id BIGINT primary key not null,
firstName VARCHAR(255),
lastName VARCHAR(255)
);
„
@Entity Annotation
‰
‰
‰
Optionales name Attribut
Name der Entity Bean in EJB QL Ausdrücken
Default: Unqualifizierter Name der Bean Klasse
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
222
2
6. Objekt-Relationales Mapping
6.1 Programmiermodell
„
Entity Bean
import javax.persistence.*;
@Entity
public class Customer implement java.io.Serializable {
@Id
private long id;
private String firstName;
private String lastName;
public int getId(() { return id; }
public void setId(int id) { this.id = id; }
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) {this.firstName=firstName;}
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName=lastName; }
}
‰
‰
Attribute bestimmen persistente Felder
Alle Mapping Annotationen müssen gleichartig angebracht werden
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
223
Enterprise JavaBeans
6. Objekt-Relationales Mapping
6.1
6.2
6.3
6.4
Programmiermodell
Einfaches Mapping
Primärschlüssel
Mapping von Properties
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
224
3
6. Objekt-Relationales Mapping
6.2 Einfaches Mapping
„
Zwei mögliche Wege
‰
‰
Start mit Objekt Modell
„
Leite davon das Datenbank Schema her
„
Normalerweise Tools, um automatisch passende Tabellen zu
erzeugen
„
Leichtes Prototyping der Anwendung
„
Später: Feintuning
Start mit existierender Datenbank
„
Entwickle passende Klassen mit entsprechenden Annotationen
„
Auch hierfür kann es Tools geben
„
Nicht immer sehr optimal
„
Mapping von Hand mit Hilfe etlicher Annotationen
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
225
6. Objekt-Relationales Mapping
6.2 Einfaches Mapping
„
Annotationen für Tabellen und Spalten
@Entity
@Table(name="CUSTOMER_TABLE")
public class Customer implement java.io.Serializable {
private long id;
private String firstName;
private String lastName;
@Id
@Column(name="CUST_ID", nullable=false, columnDefinition="integer")
public int getId(() { return id; }
public void setId(int id) { this.id = id; }
@Column(name="FIRST_NAME", length=20, nullable=false)
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) {this.firstName=firstName;}
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName=lastName; }
}
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
226
4
6. Objekt-Relationales Mapping
6.2 Einfaches Mapping
„
Annotationen für Spalten: @Column
‰
Weitere Attribute
„
boolean unique() default false
„
boolean insertable() default true
„
boolean updatable() default true
„
String columnDefinition() default ""
„
String table() default ""
„
int length() default 255
„
int precision() default 0
„
int scale() default 0
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
Komplette DDLAnweisung
227
Enterprise JavaBeans
6. Objekt-Relationales Mapping
6.1
6.2
6.3
6.4
Programmiermodell
Einfaches Mapping
Primärschlüssel
Mapping von Properties
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
228
5
6. Objekt-Relationales Mapping
6.3 Primärschlüssel
„
Identifiziert eindeutig Entity Bean
‰
‰
Mapped eine oder mehrere Properties
Mögliche Typen
„
Primitive Datentypen, inkl. Wrappers
„
java.lang.String
„
„
Primary Key Klasse, die aus diesen Datentypen zusammengesetzt
ist
Annotation: @Id
‰
Keine Attribute
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
229
6. Objekt-Relationales Mapping
6.3 Primärschlüssel
„
Generierung durch den Persistence Provider
..
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId(() { return id; }
public void setId(int id) { this.id = id; }
...
‰
GenerationTypes
„
AUTO
‰
„
Überlasse alles dem Persistence Provider, sollte man normalerweise
benutzen
TABLE
‰
Benutzerdefinierte Tabelle mit Sätzen pro Primärschlüssel
„
SEQUENCE
„
IDENTITY
‰
‰
Datenbankeigener Sequence Generator (z.B. bei Oracle)
Spezieller Datentyp für Tabellenspalte, herstellerspezifisch
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
230
6
6. Objekt-Relationales Mapping
6.3 Primärschlüssel
„
Composite Keys und Primary Key Klassen
‰
Nachschlagen, z.B. in Burke, Monson-Haefel, S. 98
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
231
Enterprise JavaBeans
6. Objekt-Relationales Mapping
6.1
6.2
6.3
6.4
Programmiermodell
Einfaches Mapping
Primärschlüssel
Mapping von Properties
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
232
7
6. Objekt-Relationales Mapping
6.4 Mapping von Properties
„
Weitere Annotationen, um das Mapping fein einzustellen
‰
@Transient
„
Vor einer Getter-Methode, die nicht zu einem persistenten Feld
führen soll
@Transient
public int getAge(() { return currentYear - yearOfBirth; }
‰
@Basic
@Basic(fetch=FetchType.LAZY, optional=false)
public String getFirstName(() { return firstName; }
„
Defaults: Umgekehrt
‰
‰
‰
FetchType.EAGER, optional=true (d.h. nullable)
Persistence Provider muss FetchType nicht einhalten
Eher nicht anwenden!
© Prof. Dr. Björn Dreher
Liste V – Enterprise JavaBeans
233
8
Herunterladen