Hibernate Klasy trwałe

34
Odwzorowania relacyjno- obiektowe Hibernate Klasy trwałe

description

Hibernate Klasy trwałe. Klasy trwałe. Podstawowym pojęciem w Java Persistence jest encja. Encja to lekki obiekt służący do reprezentacji trwałych danych Klasyczne POJO - (PlainOldJava Objects) Bezargumentowy konstruktor oznaczony jako public lub protected - PowerPoint PPT Presentation

Transcript of Hibernate Klasy trwałe

Page 1: Hibernate Klasy trwałe

Odwzorowania relacyjno-obiektowe

HibernateKlasy trwałe

Page 2: Hibernate Klasy trwałe

2Odwzorowania relacyjno-obiektowe Klasy trwałe

• Podstawowym pojęciem w Java Persistence jest encja. Encja to lekki obiekt służący do reprezentacji trwałych danych

• Klasyczne POJO - (PlainOldJava 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

Page 3: Hibernate Klasy trwałe

3Odwzorowania relacyjno-obiektowe Definiowanie klasy trwałej (I)

• 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 @GeneratedValue dla klucza głównego

Page 4: Hibernate Klasy trwałe

4Odwzorowania 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

Page 5: Hibernate Klasy trwałe

5Odwzorowania relacyjno-obiektowe @Entity

package javax.persistence;

@Target(TYPE)

@Retention(RUNTIME) public

@interface Entity

{

String name() default "";

}

Page 6: Hibernate Klasy trwałe

6Odwzorowania relacyjno-obiektowe @Table

package javax.persistence;@Target(TYPE)@Retention(RUNTIME)public @interface Table {

String name() default "";String catalog() default "";String schema() default ""; UniqueConstraint []uniqueConstraints() default {};

}

Page 7: Hibernate Klasy trwałe

7Odwzorowania relacyjno-obiektowe @Basic

package javax.persistence;

@Target({Method, FIELD})

@Retention(RUNTIME)

public @interface Basic

{

FetchType fetch() default EAGER;

boolean optional() default true;}

Page 8: Hibernate Klasy trwałe

8Odwzorowania relacyjno-obiektowe @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;

.....

Page 9: Hibernate Klasy trwałe

9Odwzorowania relacyjno-obiektowe @Column (II)

.....

String columnDefinition() default "";

String table() default "";

int length() default 255;

int precision() default 0;

int scale() default 0;

boolean specified() default true;

}

Page 10: Hibernate Klasy trwałe

10Odwzorowania relacyjno-obiektowe @Id

@Target({METHOD, FIELD})

Retention(RUNTIME)

public @interface Id { }

Page 11: Hibernate Klasy trwałe

11Odwzorowania relacyjno-obiektowe @GeneratedValue

@Target({METHOD, FIELD})

@Retention(RUNTIME)

public @interface GeneratedValue

{

GenerationType strategy() default AUTO;

String generator() default ""; }

Page 12: Hibernate Klasy trwałe

12Odwzorowania relacyjno-obiektowe 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

– MySQL - IDENTITY – Resin - IDENTITY – Postgres - SEQUENCE – Oracle - SEQUENCE

Page 13: Hibernate Klasy trwałe

13Odwzorowania relacyjno-obiektowe Inne annotacje

@Temporal(TemporalType.DATE)

//@Temporal(TemporalType.TIMESTAMP)

private Date dataUrodzenia;

@Enumerated(EnumType.STRING)

private Typ typ;

@Lob

String opisXML;

Page 14: Hibernate Klasy trwałe

14Odwzorowania relacyjno-obiektowe Ograniczenia

@Length(min=, max=)

@Max(value=)

@Min(value=)

@Past

@Future

@Range(min=, max=)

@Size(min=, max=)

Page 15: Hibernate Klasy trwałe

15Odwzorowania relacyjno-obiektowe @Version

@Version() private int optLock;

Page 16: Hibernate Klasy trwałe

16Odwzorowania relacyjno-obiektowe Klasy trwałe

@Entity

public class Uzytkownik

{

@Id

private Long id;

private String imie;

public Long getId() {return id;}

private void setId(Long id) {this.id = id;}

public String getImie() {return imie;}

public void setImie(String imie) {

this.imie = imie;}

}

CREATE TABLE uzytkownik

(

id bigint NOT NULL,

imie character varying(255),

CONSTRAINT uzytkownik_pkey PRIMARY KEY (id)

)

Page 17: Hibernate Klasy trwałe

17Odwzorowania relacyjno-obiektowe Przykładowy obiekt domenowy (I)

@Entity

public class Uzytkownik {

@GeneratedValue(generator = "Uzytkownik_SEQUENCE")

@Id

@SequenceGenerator(name = "Uzytkownik_SEQUENCE", sequenceName = "Uzytkownik_SEQ")

private int id;

private String nazwisko="";

private String imie="";

private String telefon="";

....

Page 18: Hibernate Klasy trwałe

18Odwzorowania relacyjno-obiektowe Przykładowy obiekt domenowy (II)

........

private String login = "";

private String haslo = "";

@Transient

private String pokoj_id="0";

@ManyToOne

@JoinColumn(name = "pokoj_id")

private Pokoj pokoj;

.....

Page 19: Hibernate Klasy trwałe

19Odwzorowania relacyjno-obiektowe Przykładowy obiekt domenowy (III)

@Column(nullable = false)

@Min(0)

@Max(999)

private Integer numerPracowniczy;

@Column(nullable = false, scale = 2)

private Float wzrost;

@Column(length = 1000)

private String opis;

.......

}

Page 20: Hibernate Klasy trwałe

20Odwzorowania relacyjno-obiektowe Unikalność danych

@Column(unique = true, length = 20)

private String login;

@Table(

name=”spotkania",

uniqueConstraints =

{@UniqueConstraint(columnNames={”miesiac", ”dzien"})}

)

Page 21: Hibernate Klasy trwałe

21Odwzorowania relacyjno-obiektowe Cykl życia (I)

• 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.

Page 22: Hibernate Klasy trwałe

22Odwzorowania relacyjno-obiektowe Cykl życia (II)

• 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

Page 23: Hibernate Klasy trwałe

23Odwzorowania relacyjno-obiektowe Cykl życia (III)

• 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

Page 24: Hibernate Klasy trwałe

24Odwzorowania relacyjno-obiektowe Cykl życia (IV)

Page 25: Hibernate Klasy trwałe

25Odwzorowania relacyjno-obiektowe

@Repository

public class UzytkownikDAOImpl implements UzytkownikDAO

{

@Autowired

protected SessionFactory sessionFactory;

......

Klasa DAO (I)

Page 26: Hibernate Klasy trwałe

26Odwzorowania relacyjno-obiektowe

public class UzytkownikDAOImpl extends HibernateDaoSupport implements UzytkownikDAO

{

public void setHibernateSessionFactory(@Qualifier("hibernateSessionFactory") SessionFactory factory)

{

setSessionFactory(factory);

}

.....

Klasa DAO (II)

Page 27: Hibernate Klasy trwałe

27Odwzorowania relacyjno-obiektowe

public Uzytkownik get(int id)

{

Uzytkownik u = (Uzytkownik) sessionFactory.getCurrentSession().load(Uzytkownik.class, id);

return u;

}

public Uzytkownik get(int id)

{

Uzytkownik u = (Uzytkownik) sessionFactory.getCurrentSession().get(Uzytkownik.class, id);

return u;

}

Pobieranie obiektu (I)

Page 28: Hibernate Klasy trwałe

28Odwzorowania relacyjno-obiektowe Pobieranie obiektu (II)

public Uzytkownik get(int id)

{

Uzytkownik u = null;

u = (Uzytkownik) getHibernateTemplate().load(Uzytkownik.class, id);

return u;

}

public ArrayList<Uzytkownik> findAll()

{

ArrayList<Uzytkownik> u = (ArrayList<Uzytkownik>) getHibernateTemplate().find("from Uzytkownik");

return u;

}

Page 29: Hibernate Klasy trwałe

29Odwzorowania relacyjno-obiektowe Pobieranie obiektu (III)

public ArrayList<Uzytkownik> findByPokojId(int id)

{

ArrayList<Uzytkownik> u = (ArrayList<Uzytkownik>) getHibernateTemplate().find("from Uzytkownik where pokoj_id = ?", id);

return u;

}

public Uzytkownik findByLogin(String login)

{

ArrayList<Uzytkownik> u = (ArrayList<Uzytkownik>) getHibernateTemplate().find("from Uzytkownik where login = ?", login);

if ( u==null || u.isEmpty()) return null;

return u.get(0);

}

Page 30: Hibernate Klasy trwałe

30Odwzorowania relacyjno-obiektowe Pobieranie obiektu (IV)

public Uzytkownik getUzytkownikDoEdycji(int id)

{

Uzytkownik uzytkownik = this.get(id);

if (uzytkownik != null)

{

getHibernateTemplate().initialize(uzytkownik.getDzieciLista());

}

return uzytkownik;

}

Page 31: Hibernate Klasy trwałe

31Odwzorowania relacyjno-obiektowe Zapisywanie obiektu

public void persist(Uzytkownik u)

{

sessionFactory.getCurrentSession().persist(u);

}

public void save(Uzytkownik u)

{

sessionFactory.getCurrentSession().save(u);

}

Page 32: Hibernate Klasy trwałe

32Odwzorowania relacyjno-obiektowe Edycja obiektu

public void update(Uzytkownik u)

{

sessionFactory.getCurrentSession().update(u);

}

public void saveOrUpdate(Uzytkownik u)

{

sessionFactory.getCurrentSession().saveOrUpdate(u);

}

public final void refresh(Uzytkownik u)

{

sessionFactory.getCurrentSession().refresh(u);

}

Page 33: Hibernate Klasy trwałe

33Odwzorowania relacyjno-obiektowe Usuwanie obiektu

public void delete(Uzytkownik u)

{

sessionFactory.getCurrentSession().delete(u);

}

Page 34: Hibernate Klasy trwałe

34Odwzorowania relacyjno-obiektowe

getSession()

getHibernateTemplate().getSessionFactory().getCurrentSession()

Pobieranie obiektu session