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