Objektorientierter Systementwurf mit Java Seminar im Arbeitsbereich Technische Informatik (SoSe 2001) EJB-Design und Implementierung in der Praxis (Tobias Frech)
Übersicht Design-Entscheidung Persistenz: CMP oder BMP Logik: Entity oder Vererbung mit EJB Design einer Beipielapplikation
Themeneingrenzung
EJB Wiederholung Client: (Applikation / Applet / JSP / Servlet) Server: (EJB Server) HomeInterface RemoteInterface Container Implementierung
Beispielapplikation: Vorlesungsverwaltung Person Veranstaltung Student Dozent Seminar Vorlesung Übung Hauptseminar Proseminar
Beispielapplikation: Vorlesungsverwaltung Vererbung zwischen Beans wird im EJB Standard explizit ausgeklammert praktisch aber "Mission possible" Person ID: Integer Name: String getid(): String setid(id: String) getname(): String setname(name: String) Student Veranstaltung Raum: String Termin: String Teilnehmer: List get/set... anmelden(teilnehmer: Student) Seminar Vortragende: List traegtvor(dozent: Student) MatrikelNo: String HatVordiplom: Boolean getmatrikelno(): String setmatrikelno(no: String) gethatvordiplom(): Boolean sethatvordiplom(stat: Boolean) Hauptseminar traegtvor(dozent: Student)
Design-Entscheidung CMP oder BMP CMP: Container Managed Persistence Daten Daten Container Entity BMP: Bean Managed Persistence Container Entity steuert Daten bank Daten bank + sehr portabel + kein Datenbankcode Kontrolle nur über Deskriptor + volle Kontrolle eigener Datenbankcode evtl. schwieriger zu portieren
Vererbung mit/bei CMP Person ID: Integer Name: String getid(): String setid(id: String) getname(): String setname(name: String) Student MatrikelNo: String HatVordiplom: Boolean getmatrikelno(): String setmatrikelno(no: String) gethatvordiplom(): Boolean sethatvordiplom(stat: Boolean) PersonDB StudentDB ID Name ID Name MatrikelNo HatVordiplom
Wohin mit der Logik? Entity Geschäftsprozeß? Stateful Stateless
Wohin mit der Logik: Design-Prozeß Entity Locking Blockieren Reentrant Zustand wichtig? Verklemmungen (dead locks)? bei hoher Last? Aufwand für Synchronisierung! Stateful Stateless
Beispielapplikation: Vorlesungsverwaltung create Anmelden Home Anmelden lookup Hauptseminar Home traegtvor lookup Hauptseminar Student Home gethatvordiplom Student
Vererbung mit EJB: Mission impossible PersonDB Person suchen Client StudentDB erstellen Student Lösungsansatz: Typ des gesuchten Objekts vorab "wissen"
Vererbung praktisch: super() create: Veranstaltung Seminar Hauptseminar leere "Raum" leere "Termin" lege Teilnehmer Array an create: create: anmelden: anmelden: anmelden: speichere Student in Teilnehmer Array lege Vortragenden Array an super.create() (vererbt) (vererbt) hole "HatVordiplom" des Studenten überprüfen super.anmelden()
Zusammenfassung Entwurfsentscheidungen: CMP oder BMP Wohin mit Geschäftsprozessen Locking Blockieren Reentrant Container Daten Daten Entity Entity bank Zustand wichtig? Stateful Stateless Vererbung: grundsätzlich ok Suchen (lookups) problematisch super() Benutzung Veranstaltung PersonDB Raum: String Person Veranstaltung Seminar Hauptseminar Termin: String ID: Integer Teilnehmer: List create: create: create: Person Name: String leere "Raum" lege Vortragenden get/set... suchen leere "Termin" Array an getid(): String (vererbt) anmelden(teilnehmer: Student) lege Teilnehmer super.create() setid(id: String) Client Array an getname(): String setname(name: String) anmelden: anmelden: anmelden: Student MatrikelNo: String HatVordiplom: Boolean Seminar Vortragende: List traegtvor(dozent: Student) erstellen Student StudentDB speichere Student in Teilnehmer Array (vererbt) hole "HatVordiplom" des Studenten überprüfen super.anmelden() getmatrikelno(): String setmatrikelno(no: String) gethatvordiplom(): Boolean sethatvordiplom(stat: Boolean) Hauptseminar anmelden(teilnehmer: Student)