Odwzorowania relacyjnoobiektowe Hibernate Klasy trwae Klasy trwae Odwzorowania
Odwzorowania relacyjno-obiektowe Hibernate Klasy trwałe
Klasy trwałe Odwzorowania relacyjno-obiektowe • Podstawowym pojęciem w Java Persistence jest encja. Encja to lekki obiekt służący do reprezentacji trwałych danych • Klasyczne POJO - (Plain. Old. Java Objects) – Bezargumentowy konstruktor oznaczony jako public lub protected – Brak oznaczenia final dla klasy, jak i dla pól i metod – Implementacja interfejsu Serializable w przypadku transferu encji 2
Definiowanie klasy trwałej (I) Odwzorowania relacyjno-obiektowe • Klasa oznaczona adnotacją @Entity • Możliwość zdefiniowania nazwy tabeli dzięki adnotacji @Table • Adnotacje dla metod get pól klasy lub zmiennych • Każda encja musi posiadać klucz główny. – @Id i @Generated. Value dla klucza głównego 3
Odwzorowania relacyjno-obiektowe Definiowanie klasy trwałej (II) • Pola odpowiadające kolumnom tabeli • Opcjonalna adnotacja @Column, określająca nazwę kolumny • Adnotacje odpowiedzialne za relacje • Pola nie odpowiadające kolumnom w bazie oznaczone adnotacją @Transient 4
@Entity package javax. persistence; @Target(TYPE) @Retention(RUNTIME) public @interface Entity { String name() default ""; } Odwzorowania relacyjno-obiektowe 5
@Table Odwzorowania relacyjno-obiektowe package javax. persistence; @Target(TYPE) @Retention(RUNTIME) public @interface Table { String name() default ""; String catalog() default ""; String schema() default ""; Unique. Constraint []unique. Constraints() default {}; } 6
@Basic Odwzorowania relacyjno-obiektowe package javax. persistence; @Target({Method, FIELD}) @Retention(RUNTIME) public @interface Basic { Fetch. Type fetch() default EAGER; boolean optional() default true; } 7
@Column (I) @Target({Method, FIELD}) @Retention(RUNTIME) public @interface Column { String name() default ""; boolean unique() default false; boolean nullable() default true; boolean insertable() default true; boolean updateable() default true; . . . Odwzorowania relacyjno-obiektowe 8
@Column (II). . . String column. Definition() default ""; String table() default ""; int length() default 255; int precision() default 0; int scale() default 0; boolean specified() default true; } Odwzorowania relacyjno-obiektowe 9
@Id @Target({METHOD, FIELD}) Retention(RUNTIME) public @interface Id { } Odwzorowania relacyjno-obiektowe 10
@Generated. Value Odwzorowania relacyjno-obiektowe @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface Generated. Value { Generation. Type strategy() default AUTO; String generator() default ""; } 11
Odwzorowania relacyjno-obiektowe 12 Typy generatorów kluczy głównych • IDENTITY – baza danych generuje klucze główne - SERIAL, IDENTITY • SEQUENCE • TABLE – wykorzystanie tabeli do generowania kluczy głównych • IDCLASS • AUTO – My. SQL - IDENTITY – Resin - IDENTITY – Postgres - SEQUENCE – Oracle - SEQUENCE
Inne annotacje Odwzorowania relacyjno-obiektowe @Temporal(Temporal. Type. DATE) //@Temporal(Temporal. Type. TIMESTAMP) private Date data. Urodzenia; @Enumerated(Enum. Type. STRING) private Typ typ; @Lob String opis. XML; 13
Ograniczenia @Length(min=, max=) @Max(value=) @Min(value=) @Past @Future @Range(min=, max=) @Size(min=, max=) Odwzorowania relacyjno-obiektowe 14
@Version() private int opt. Lock; Odwzorowania relacyjno-obiektowe 15
Klasy trwałe @Entity public class Uzytkownik { @Id private Long id; private String imie; public Long get. Id() {return id; } private void set. Id(Long id) {this. id = id; } public String get. Imie() {return imie; } public void set. Imie(String imie) { this. imie = imie; } } Odwzorowania relacyjno-obiektowe 16 CREATE TABLE uzytkownik ( id bigint NOT NULL, imie character varying(255), CONSTRAINT uzytkownik_pkey PRIMARY KEY (id) )
Odwzorowania relacyjno-obiektowe Przykładowy obiekt domenowy (I) @Entity public class Uzytkownik { @Generated. Value(generator = "Uzytkownik_SEQUENCE") @Id @Sequence. Generator(name = "Uzytkownik_SEQUENCE", sequence. Name = "Uzytkownik_SEQ") private int id; private String nazwisko=""; private String imie=""; private String telefon=""; . . 17
Odwzorowania relacyjno-obiektowe Przykładowy obiekt domenowy (II). . . . private String login = ""; private String haslo = ""; @Transient private String pokoj_id="0"; @Many. To. One @Join. Column(name = "pokoj_id") private Pokoj pokoj; . . . 18
Odwzorowania relacyjno-obiektowe Przykładowy obiekt domenowy (III) @Column(nullable = false) @Min(0) @Max(999) private Integer numer. Pracowniczy; @Column(nullable = false, scale = 2) private Float wzrost; @Column(length = 1000) private String opis; . . . . } 19
Unikalność danych Odwzorowania relacyjno-obiektowe 20 @Column(unique = true, length = 20) private String login; @Table( name=”spotkania", unique. Constraints = {@Unique. Constraint(column. Names={”miesiac", ”dzien"})} )
Cykl życia (I) Odwzorowania relacyjno-obiektowe 21 • W pewnych sytuacjach synchronizacja stanu obiektów z bazą danych może nastąpić przed wykonaniem pewnych zapytań, aby zapewnić spójność odczytu. • Hibernate posiada mechanizm umożliwiający określenie, które obiekty zostały zmodyfikowane w ramach transakcji. Mechanizm ten powoduje, że synchronizacji są poddawane tylko obiekty zmodyfikowane. W Hibernate mechanizm ten nazywa się automatic dirty checking. • Cecha transparent transaction-level write-behind odpowiada ze synchronizacje stanu obiektu z bazą danych, aby odbywała się ona najpóźniej jak to jest tylko możliwe.
Cykl życia (II) Odwzorowania relacyjno-obiektowe • Hibernate synchronizuje sesje w następujących przypadkach: – Przed wykonaniem pewnych zapytań. W celu zachowania spójności transakcji – Przy zatwierdzaniu transakcji – W przypadku jawnego wywołania metody flush() • Kolejność wykonywania operacji przy synchronizacji: – Zapis wszystkich obiektów, w kolejności w jakiej były wywołane metody save() – Aktualizacja wszystkich obiektów – Dodanie , aktualizacja, usunięcie obiektów z kolekcji – Usunięcie obiektów 22
Cykl życia (III) Odwzorowania relacyjno-obiektowe • Nowy (new) – obiekt utworzony, jednak nie włączony do żadnego trwałego kontekstu • Zarządzany (managed) – obiekt utworzony i włączony do kontekstu przy pomocy menadżera encji, posiada klucz główny • Oddzielony (detached) – obiekt posiada klucz główny, jednak nie jest obecnie skojarzony z żadnym kontekstem • Usunięty (removed) – obiekt posiada klucz główny, jest skojarzony z trwałym kontekstem i został wskazany do usunięcia z bazy danych 23
Cykl życia (IV) Odwzorowania relacyjno-obiektowe 24
Klasa DAO (I) Odwzorowania relacyjno-obiektowe @Repository public class Uzytkownik. DAOImpl implements Uzytkownik. DAO { @Autowired protected Session. Factory session. Factory; . . . 25
Klasa DAO (II) Odwzorowania relacyjno-obiektowe 26 public class Uzytkownik. DAOImpl extends Hibernate. Dao. Support implements Uzytkownik. DAO { public void set. Hibernate. Session. Factory(@Qualifier("hibernate. Session. F actory") Session. Factory factory) { set. Session. Factory(factory); }. . .
Pobieranie obiektu (I) Odwzorowania relacyjno-obiektowe public Uzytkownik get(int id) { Uzytkownik u = (Uzytkownik) session. Factory. get. Current. Session(). load(Uzytkownik. class, id); return u; } public Uzytkownik get(int id) { Uzytkownik u = (Uzytkownik) session. Factory. get. Current. Session(). get(Uzytkownik. class, id); return u; } 27
Pobieranie obiektu (II) Odwzorowania relacyjno-obiektowe public Uzytkownik get(int id) { Uzytkownik u = null; u = (Uzytkownik) get. Hibernate. Template(). load(Uzytkownik. class, id); return u; } public Array. List<Uzytkownik> find. All() { Array. List<Uzytkownik> u = (Array. List<Uzytkownik>) get. Hibernate. Template(). find("from Uzytkownik"); return u; } 28
Pobieranie obiektu (III) Odwzorowania relacyjno-obiektowe 29 public Array. List<Uzytkownik> find. By. Pokoj. Id(int id) { Array. List<Uzytkownik> u = (Array. List<Uzytkownik>) get. Hibernate. Template(). find("from Uzytkownik where pokoj_id = ? ", id); return u; } public Uzytkownik find. By. Login(String login) { Array. List<Uzytkownik> u = (Array. List<Uzytkownik>) get. Hibernate. Template(). find("from Uzytkownik where login = ? ", login); if ( u==null || u. is. Empty()) return null; return u. get(0); }
Pobieranie obiektu (IV) Odwzorowania relacyjno-obiektowe 30 public Uzytkownik get. Uzytkownik. Do. Edycji(int id) { Uzytkownik uzytkownik = this. get(id); if (uzytkownik != null) { get. Hibernate. Template(). initialize(uzytkownik. get. Dzieci. Lista()); } return uzytkownik; }
Zapisywanie obiektu Odwzorowania relacyjno-obiektowe public void persist(Uzytkownik u) { session. Factory. get. Current. Session(). persist(u); } public void save(Uzytkownik u) { session. Factory. get. Current. Session(). save(u); } 31
Edycja obiektu Odwzorowania relacyjno-obiektowe public void update(Uzytkownik u) { session. Factory. get. Current. Session(). update(u); } public void save. Or. Update(Uzytkownik u) { session. Factory. get. Current. Session(). save. Or. Update(u); } public final void refresh(Uzytkownik u) { session. Factory. get. Current. Session(). refresh(u); } 32
Usuwanie obiektu Odwzorowania relacyjno-obiektowe 33 public void delete(Uzytkownik u) { session. Factory. get. Current. Session(). delete(u); }
Pobieranie obiektu session Odwzorowania relacyjno-obiektowe get. Session() get. Hibernate. Template(). get. Session. Factory(). get. Current. Session() 34
- Slides: 34