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