Transcript Hibernate

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 - (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
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 @GeneratedValue 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
Odwzorowania relacyjno-obiektowe
@Entity
package javax.persistence;
@Target(TYPE)
@Retention(RUNTIME) public
@interface Entity
{
String name() default "";
}
5
Odwzorowania 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 {};
}
6
Odwzorowania relacyjno-obiektowe
@Basic
package javax.persistence;
@Target({Method, FIELD})
@Retention(RUNTIME)
public @interface Basic
{
FetchType fetch() default EAGER;
boolean optional() default true;
}
7
Odwzorowania 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;
.....
8
Odwzorowania 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;
}
9
Odwzorowania relacyjno-obiektowe
@Id
@Target({METHOD, FIELD})
Retention(RUNTIME)
public @interface Id { }
10
Odwzorowania relacyjno-obiektowe
@GeneratedValue
@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface GeneratedValue
{
GenerationType strategy() default AUTO;
String generator() default "";
}
11
Odwzorowania 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
12
Odwzorowania relacyjno-obiektowe
Inne annotacje
@Temporal(TemporalType.DATE)
//@Temporal(TemporalType.TIMESTAMP)
private Date dataUrodzenia;
@Enumerated(EnumType.STRING)
private Typ typ;
@Lob
String opisXML;
13
Odwzorowania relacyjno-obiektowe
Ograniczenia
@Length(min=, max=)
@Max(value=)
@Min(value=)
@Past
@Future
@Range(min=, max=)
@Size(min=, max=)
14
Odwzorowania relacyjno-obiektowe
@Version
@Version()
private int optLock;
15
Klasy trwałe
@Entity
public class Uzytkownik
{
@Id
private Long id;
private String imie;
Odwzorowania relacyjno-obiektowe
CREATE TABLE uzytkownik
(
id bigint NOT NULL,
imie character varying(255),
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;}
}
16
CONSTRAINT
uzytkownik_pkey
PRIMARY KEY (id)
)
Odwzorowania 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="";
....
17
Odwzorowania 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;
.....
18
Odwzorowania 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;
.......
}
19
Unikalność danych
Odwzorowania relacyjno-obiektowe
20
@Column(unique = true, length = 20)
private String
login;
@Table(
name=”spotkania",
uniqueConstraints =
{@UniqueConstraint(columnNames={”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
Odwzorowania relacyjno-obiektowe
Klasa DAO (I)
@Repository
public class UzytkownikDAOImpl implements
UzytkownikDAO
{
@Autowired
protected SessionFactory sessionFactory;
......
25
Odwzorowania relacyjno-obiektowe
26
Klasa DAO (II)
public class UzytkownikDAOImpl extends
HibernateDaoSupport implements UzytkownikDAO
{
public void
setHibernateSessionFactory(@Qualifier("hibernateSessionF
actory") SessionFactory factory)
{
setSessionFactory(factory);
}
.....
Odwzorowania relacyjno-obiektowe
Pobieranie obiektu (I)
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;
}
27
Odwzorowania 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;
}
28
Odwzorowania 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);
}
29
Odwzorowania relacyjno-obiektowe
30
Pobieranie obiektu (IV)
public Uzytkownik getUzytkownikDoEdycji(int id)
{
Uzytkownik uzytkownik = this.get(id);
if (uzytkownik != null)
{
getHibernateTemplate().initialize(uzytkownik.getDzieciLista());
}
return uzytkownik;
}
Odwzorowania relacyjno-obiektowe
Zapisywanie obiektu
public void persist(Uzytkownik u)
{
sessionFactory.getCurrentSession().persist(u);
}
public void save(Uzytkownik u)
{
sessionFactory.getCurrentSession().save(u);
}
31
Odwzorowania 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);
}
32
Odwzorowania relacyjno-obiektowe
33
Usuwanie obiektu
public void delete(Uzytkownik u)
{
sessionFactory.getCurrentSession().delete(u);
}
Odwzorowania relacyjno-obiektowe
Pobieranie obiektu session
getSession()
getHibernateTemplate().getSessionFactory().
getCurrentSession()
34