Identity Field Radim Veselý ČVUT v Praze 28. 4. 2013Radim Veselý ČVUT v Praze 28. 4. 2013 Michal Kouřík ČVUT v Praze 13.4.2014.

Slides:



Advertisements
Podobné prezentace
Základy jazyka SQL Jan Tichava
Advertisements

Ladislav Hofman, Jan Slavík TUL Předmět databázové systémy
Špička v každém směru IT 3 Produktivita práce s Eclipse.
YOUR LOGO ADO.NET - Práca s databázou. YOUR LOGO ADO.NET  ADO.NET představuje soubor tříd pro přístup k datům v technologii.NET.
A5M33IZS – Informační a znalostní systémy Dotazovací jazyk SQL - I.
SQL: DDL v ORACLE CREATE TABLE jméno_tabulky (atribut datový_typ [DEFAULT][attribut_constraint] [, atribut datový_typ [DEFAULT] [attribut_constraint]],...
Jazyk SQL Ing. Zdena DOBEŠOVÁ. SQL Structured Query Language 1974 SEQUEL (Structured English Query Language) neprocedurální relační dotazovací jazyk norma.
DB1 – 9. cvičení Optimalizace dotazu Konkurenční přístup a deadlock Indexace Transakce.
Pole, ukazatele a odkazy
Informační systémy Realizace uložených procedur a spouští, jejich praktické využití.
Informatika pro ekonomy II přednáška 11
Databázové systémy 1 Cvičení č. 2 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Desáté cvičení Java Core API Java Collection Framework JavaDoc.
Temporální databáze a TSQL
Václav Martínek. Evidence předení koček Vytvoření nové databáze - Po přihlášení se k databázovému serveru (Database Engine) si ze všeho nejdříve vytvoříme.
MySQL - Vytvoření nové tabulky  create table jméno_tabulky (jméno_položky typ_položky,... ) Přehled nejběžnějších datových typů Přehled nejběžnějších.
Databáze výhody a nevýhody Ing. Emilie Šeptáková
Softwareová architektura
C# - Exceptions (výjimky)
Databázové systémy teorie a návrh relačních databázových systémů část II.
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
PRÁCE S VLÁKNY A APLIKAČNÍ DOMÉNY V.NET FRAMEWORK APLIKACÍCH Architektura technologie.NET Jan Martinovič, FEI - Katedra Informatiky.
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
Composite [kompozit, ne kompozajt]. Composite Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit hierarchii tříd složenou ze dvou druhů.
Dependency injection Předávání závislostí Petr Kalivoda
Principals, Securables, Schema Vít Ochozka. Entity databáze - zdroje Securables –Entity databáze (zdroje), ke kterým SQL reguluje přístup podle práv –Hierachie.
Databázové systémy I Cvičení č. 6 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
SQL PVA Jan Hora. SQL „graficky“ Grafický vs. pravý SQL SELECT ORDED BY WHERE.
Rauer Luboš Kopic Petr Blažek Tomáš. Structured Query Language - dotazovací jazyk -> pracuje s dotazy - neprocedurální jazyk - mocný, ale přitom jednoduchý.
Memento. Obnovení operačního systému ( Windows | Linux...) Všichni víme, co jsou transekce v databázi Memento – zálohování databáze.
Association table mapping Jakub Chalupa Naim Ashhab ČVUT FEL A7B36ASS – Architektura SW systémů LS 2014.
Číslo šablony: III/2 VY_32_INOVACE_P4_3.8 Tematická oblast: Aplikační software pro práci s informacemi II. Databáze – základy SQL Typ: DUM - kombinovaný.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
Architektury a techniky DS Cvičení č. 9 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
Metodika objektového přístupu při tvorbě překladačů. Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
Šesté cvičení Výjimky Balíky.
Aplikační a programové vybavení
123.
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
Základní obeznámení s jazykem SQL Databázové systémy.
Databázové Aplikace Slidy ke cvičení DBI026, část 3 KSI MFF UK Verze
FEL Komunikátor. Memory Leak program konsumuje operační paměť, kterou neumožňuje uvolnit o uvolnění paměti stará Garbage Collector ▫plně v režii Java.
Foreign key mapping Jakub Chalupa Naim Ashhab ČVUT FEL
Obchodní akademie, Ostrava-Poruba, příspěvková organizace Vzdělávací materiál/DUM VY_32_INOVACE_01B15 Autor Ing. Jiří Kalousek Období vytvoření březen.
Kam se ubírá jazyk C#? Dr. Ing. Dalibor Kačmář Academic Developer Evangelist Developer & Platform Evangelist Group Microsoft Czech & Slovakia Anders Hejlsberg.
Service layer. Service layer – úvod Problém  Vytvoření API aplikace  Odstínění bussiness logiky a transakčního chování od zbytku aplikace  Kam s aplikační.
Observer Martin Dráb Návrhové vzory, Co to je?  Definuje závislost 1:N mezi objekty  Závislé objekty jsou informovány o změně stavu  Konzistentní.
Petr Chmelař UIFS FIT VUT JAVA pro PDB Kafe? Jako C++ Zrníčka 1 / 12 Java rychlokvaška pro PDB [ ]
Strategy. Motivace Různé algoritmy pro stejnou akci Hromada kódu v mnoha podmínkách Důsledky  Komplexnost  Špatná čitelnost  Těžká správa kódu  Těžka.
Proxy. Popis  Klient má přístup k nějakému objektu  Potřebujeme tento přístup ošetřit, aniž bychom přidělali klientovi práci Kontrola přístupu Vzdálený.
FUN WITH C# EPISODE XIII INTERFACES STRIKE BACK CLI Type System All types Reference types (allocated on managed heap) PointersValue types (allocated.
Petr Puš SW Architekt Unicorn a.s. Microsoft C# MVP.
YOUR LOGO C# Entity Framework. YOUR LOGO  Entity framework nám poskytuje: -Vytváří objektový model na základě databázového schématu -Mapuje tabulky,
Proxy. Proxy poskytuje bariéru mezi klientem a reálnou implementací.
Databázové systémy přednáška 6 – Indexy
SOLID principy v OOP návrhu
Dotazovací jazyk SQL - III
Dotazovací jazyk SQL I.
VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - CVIČENÍ
Návrhový vzor Flyweight
Lazy load Použity informace z knihy Patterns of Enterprise Application Architecture od M. Fowlera Jan Sládek.
Bridge.
Šablona 32 VY_32_INOVACE_038.ICT.34
Reflexe jako introspekce
Databázové systémy a SQL
C# přehled vlastností.
Přednáška 9 Triggery.
Composite “Spojuj a panuj”.
Transkript prezentace:

Identity Field Radim Veselý ČVUT v Praze Radim Veselý ČVUT v Praze Michal Kouřík ČVUT v Praze

Identity Field– úvod Návrhový vzor patřící do skupiny ORM design patterns Problém  Zapsání dat do databáze – potřebujeme jasně namapovat řádek v databázi na objekt v paměti Jak na to?  Vybrat vhodný klíč a uložit ho jako atribut třídy

Výběr klíče Meaningful / meaningless key Simple / compound key Table-unique / database-unique key  Vždy pouze jedno ID pro danou hierarchii tříd (Concrete Table Inheritance) Typ klíče  Simple – stejný typ jako je v databázi  Compound – řešit přes samostatný objekt

Implementace – simple key class DomainObject { private long PLACEGOLDER_ID = -1; private long id = PLACEHOLDER_ID; public Boolean isNew() { return id == PLACEHOLDER_ID; }

Implementace – compound key class DomainObject { private Key key; protected DomainObject(Key ID) { this.key = ID; } public Key getKey() { return this.key; } public void setKey(Key key) { this.key = key; } class Key { private Object[] fields; public Key(Object[] fields) { this.fields = fields; }

Získání hodnoty klíče Předat zodpovědnost databázi  Nejjednodušší, nic neřeším, databáze ID vygeneruje při insertu  Problém – každý databázový stroj může mít implementováno jinak – problém s ORM Auto-generated field  Nejběžnější Sekvence  Nemusí být dostupná na všech DB strojích GUID  Používat s rozvahou – příliš velký, špatně se s ním pracuje  {25892e17-80f6-415f-9c f0223}

Implementace – key table Tabulka obsahující další ID v řadě pro každou tabulku CREATE TABLE keys (name varchar primary key, nextID int); INSERT INTO keys VALUES (‘orders’, 1); CREATE TABLE keys (name varchar primary key, nextID int) INSERT INTO keys VALUES ('orders', 1)

Příklad z praxe - public abstract class DomainObject implements Serializable { private static final long serialVersionUID = GenerationType.AUTO, generator = = true, nullable = false) private Long id; // getters & setters & hashcode & equals metody }

Shrnutí Základní stavební kámen pro veškeré aplikace ukládající do DB Jakou implementaci?  Ve valné většině si vystačíme s jednoduchým klíčem typu long Související vzory  Identity Map  Domain Model  Row Data Gateway

Dependent mapping

Dependent mapping – úvod Problém  práce s databází spíš než objektový vzor  ukládání kolekcí do databáze  entity kolekce jsou jednoduché z hlediska vztahů (váží se pouze k jedinému objektu)  snažíme se o minimalistické řešení Příklad:  ukládání písniček k albu  vybavení auta (rezerva, žárovky...) Jak na to?  entity kolekce nemají vlastní ID  nemají smysl samy o sobě  při práci s entitami přistupujeme přes vlastníka kolekce

Dependent mapping – struktura - příklad Závislý objekt Databáze Vlastník Mapovací třída

Dependent mapping – účastníci Vlastník (owner)  třída obsahující kolekci  entity mají ID Závislý (dependent)  třída tvořící entity kolekce  entity nemají ID  přistupuji k nim přes vlastníka  můžou být imutabilní Mapovací třáda (mapper)  obstarává komunikaci s db a spravuje kolekci

Dependent mapping – implementace Nahrávání kolekce  většinou probíhá zároveň s vlastníkem  při vyšší ceně nahrávání lazy load ID  entity kolekce neosahují ID, musíme s tím počítat Hierarchie Key  u závislé classy se používá composite Update  vzhledem k tomu, že nemáme ID, tak updatujeme přes delete & insert  při změně entity kolekce měníme vlastníka

Dependent mapping – implementace – model, find class Track { private final String title; public Track(String title) { this.title = title; } public String getTitle() { return title; } class Album { private List tracks = new ArrayList(); public void addTrack(Track arg) { tracks.add(arg); } public void removeTrack(Track arg) { tracks.remove(arg); }; public void removeTrack(int i) { tracks.remove(i); } public Track[] getTracks() { return (Track[]) tracks.toArray(new Track[tracks.size()]); } class AlbumMapper { protected String findStatement() { return "SELECT ID, a.title, t.title as trackTitle" + " FROM albums a, tracks t" + " WHERE a.ID = ? AND t.albumID = a.ID" + " ORDER BY t.seq"; }

Dependent mapping – implementace - load class AlbumMapper { protected DomainObject doLoad(Long id, ResultSet rs) throws SQLException { String title = rs.getString(2); Album result = new Album(id, title); loadTracks(result, rs); return result; } public void loadTracks(Album arg, ResultSet rs) throws SQLException { arg.addTrack(newTrack(rs)); while (rs.next()) { arg.addTrack(newTrack(rs)); } private Track newTrack(ResultSet rs) throws SQLException { String title = rs.getString(3); Track newTrack = new Track (title); return newTrack; }

Dependent mapping – implementace - update public void update(DomainObject arg) { PreparedStatement updateStatement = null; try { updateStatement = DB.prepare("UPDATE albums SET title = ? WHERE id = ?"); updateStatement.setLong(2, arg.getID().longValue()); Album album = (Album) arg; updateStatement.setString(1, album.getTitle()); updateStatement.execute(); updateTracks(album); } catch (SQLException e) { throw new ApplicationException(e); } finally {DB.cleanUp(updateStatement); } public void updateTracks(Album arg) throws SQLException { PreparedStatement deleteTracksStatement = null; try { deleteTracksStatement = DB.prepare("DELETE from tracks WHERE albumID = ?"); deleteTracksStatement.setLong(1, arg.getID().longValue()); deleteTracksStatement.execute(); for (int i = 0; i < arg.getTracks().length; i++) { Track track = arg.getTracks()[i]; insertTrack(track, i + 1, arg); } } finally {DB.cleanUp(deleteTracksStatement); }

Dependent mapping – implementace - update public void insertTrack(Track track, int seq, Album album) throws SQLException { PreparedStatement insertTracksStatement = null; try { insertTracksStatement = DB.prepare("INSERT INTO tracks (seq, albumID, title) VALUES (?, ?, ?)"); insertTracksStatement.setInt(1, seq); insertTracksStatement.setLong(2, album.getID().longValue()); insertTracksStatement.setString(3, track.getTitle()); insertTracksStatement.execute(); } finally {DB.cleanUp(insertTracksStatement); }

Dependent mapping – shrnutí Plusy  zjednodušení entit  pracujeme na „vyšší vrstvě“ Mínusy  práce s tvorbou mapping class  nepříjemnosti spojené s absencí ID  omezení (pouze jeden vlastník, žádné jiné reference)

Dependent mapping – související vzory Identity Field  entity obsahují ID Active record, Row Date Gateway  mapování je prováděno pomocí vlastníka Value Object  entity také nemají ID, porovnáváme podle obsahu  neřeší chování vůči db Unit Of Work  pro úpravu objektů používám pouze metody, které zaštiťují skupinu procesů  neřeší vztahy mezi objekty z pohledu db