Home >Documents >Object Relational Mapping

Object Relational Mapping

Date post:02-Jan-2016
Category:
View:31 times
Download:1 times
Share this document with a friend
Description:
Object Relational Mapping. (ORM). Objektmodell - Datenbankmodell. ORM. Pro Datenbanktabelle eine Klasse im Objektmodell (Data Transfer Object; DTO) Pro Datensatz in der Tabelle eine Instanz der Klasse Eigene Klassen für die Datenbankzugriffe (Data Access Object; DAO). ORM. Schattendaten. - PowerPoint PPT Presentation
Transcript:
  • Object Relational Mapping(ORM)

  • Objektmodell - Datenbankmodell

  • ORMPro Datenbanktabelle eine Klasse im Objektmodell (Data Transfer Object; DTO)Pro Datensatz in der Tabelle eine Instanz der Klasse Eigene Klassen fr die Datenbankzugriffe (Data Access Object; DAO)

  • ORM

  • Schattendatenid (Primrschlssel)lastUpdate (optimistic locking)storedInDb (bereits als Datensatz vorhanden)

  • Data Access Object (DAO)Verschiedene Methoden fr das AuswhlenSpeichernLschen

  • findByPrimaryKey()SELECT cd_interpret, cd_titelFROM CDSWHERE cd_id = ?ResultSet rs = if (rs.next()){CD cd = new CD();cd.setId(id);cd.setTitel(rs.getString("cd_titel"));cd.setInterpret(rs.getString("cd_interpret"));return cd;}elsereturn null;

  • findAll()SELECT cd_id, cd_interpret, cd_titelFROM CDSList liste = new ArrayList();ResultSet rs = while (rs.next()){CD cd = new CD();cd.setId(rs.getInt("cd_id"));cd.setTitel(rs.getString("cd_titel"));cd.setInterpret(rs.getString("cd_interpret"));liste.add(cd);}return liste;

  • findByTitle()SELECT cd_id, cd_interpret, cd_titelFROM CDSWHERE cd_titel = ?List liste = new ArrayList();ResultSet rs = while (rs.next()){CD cd = new CD();cd.setId(rs.getInt("cd_id"));cd.setTitel(rs.getString("cd_titel"));cd.setInterpret(rs.getString("cd_interpret"));liste.add(cd);}return liste;

  • save(CD cd)if (cd.isStoredInDb()){// UPDATE...}else{// INSERT...}PreparedStatement pstmt =

    if (pstmt.executeUpdate() == 1){// ok}else{// Fehler}INSERT INTO CDS (cd_id, cd_interpret, cd_titel)VALUES (?, ?, ?)UPDATE CDS SET cd_interpret = ?, cd_titel = ?WHERE cd_id = ?

  • remove()DELETE FROM CDSWHERE cd_id = ?PreparedStatement pstmt =

    if (pstmt.executeUpdate() == 1){// ok}else{// Fehler}

  • Einige wichtige RegelnParametrierte (?) Statements verwendenEinzelne Spalten mit Namen ansprechen (kein SELECT * )Update-Count berprfenDatenbankverbindung wiederverwendenResultSet und PreparedStatement schlieen

  • INSERT und Primary KeyINSERT

    cd_idcd_interpretcd_titel1Robbie W.Best of2MadonnaGreatest

  • INSERT und Primary KeygetGeneratedKeys()ResultSet keys = pstmt.getGeneratedKeys();if (keys.next())cd.setId(keys.getInt(1));Sequenzen

  • DTO CachingBeispiel:dao.findByPrimaryKey(key) liefert eine Referenz auf die CD-Instanz mit dem bergebenen Primrschlssel.

    Problem: Bei mehreren Aufrufen mit dem selben key sollte immer die selbe Instanz geliefert werden.

    Lsung:DAO muss einen Cache von bereits aus Datenbank ausgelesenen Instanzen halten (z.B Map)

  • Inkonsistenzen bei FehlerfllenBeispiel:berweisung eines Betrages von einem Bankkonto auf ein anderes.Saldo wird beim ersten Konto um den Betrag reduziert. Bevor der Saldo beim zweiten Konto entsprechend erhht wird, strzt das Programm ab. Inkonsistenz

    Lsung:Verwenden einer Transaktion

  • Datenbank-TransaktionIn JDBC hngt die Transaktion an der Datenbankverbindung (Connection):con.setAutoCommit(false);con.commit(); con.rollback();Jedes commit() oder rollback() beginnt zugleich die nchste Transaktion.

    Savepoints:Savepoint sp = con.setSavepoint();con.rollback(sp);

  • Gleichzeitige ZugriffeProblem:2 Clients bearbeiten den selben Datensatz.Beide Clients holen den Datensatz aus der DatenbankClient 1 ist fertig mit der Bearbeitung und fhrt ein Update durch.Client 2 ist fertig mit der Bearbeitung und fhrt ein Update durch. Die nderungen von Client 1 gehen verloren.

    Lsung:Datensatz muss beim Auslesen aus der Datenbank gesperrt werden. Datenbank-spezifisch: SELECT ... FOR UPDATE; LOCK TABLE ...

  • Pessimistic LockingDatensatz wird ausgelesen und gesperrt.Datensatz wird bearbeitet.Update wird durchgefhrt.Datensatz wird freigegeben.

    Nachteil:Datensatz sehr lange gesperrt, wenn Programm abstrzt, etc.

  • Optimistic lockingDatensatz wird ausgelesen aber nicht gesperrt.Datensatz wird bearbeitet.Datensatz wird noch einmal ausgelesen und diesmal gesperrt.Falls Datensatz noch gleich ist wie beim ersten Auslesen Update und FreigabeFalls Datensatz inzwischen verndert wurde, mssen nderungen verworfen oder zusammengefhrt werden.

  • Update-TimestampJede Tabelle erhlt ein zustzliches Timestamp-Feld (last_upd). Darin wird Zeitpunkt des letzten Updates gespeichert.Datensatz wird ausgelesenDatensatz wird bearbeitetUpdate:UPDATE WHERE last_upd = Wenn zwischendurch kein Update von anderem Client erfolgt ist, ist Update-Count = 1, ansonsten 0.

Click here to load reader

Reader Image
Embed Size (px)
Recommended