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 PresentationTRANSCRIPT
Odwzorowania relacyjno-obiektowe
HibernateKlasy 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
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
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
5Odwzorowania relacyjno-obiektowe @Entity
package javax.persistence;
@Target(TYPE)
@Retention(RUNTIME) public
@interface Entity
{
String name() default "";
}
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 {};
}
7Odwzorowania relacyjno-obiektowe @Basic
package javax.persistence;
@Target({Method, FIELD})
@Retention(RUNTIME)
public @interface Basic
{
FetchType fetch() default EAGER;
boolean optional() default true;}
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;
.....
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;
}
10Odwzorowania relacyjno-obiektowe @Id
@Target({METHOD, FIELD})
Retention(RUNTIME)
public @interface Id { }
11Odwzorowania relacyjno-obiektowe @GeneratedValue
@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface GeneratedValue
{
GenerationType strategy() default AUTO;
String generator() default ""; }
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
13Odwzorowania relacyjno-obiektowe Inne annotacje
@Temporal(TemporalType.DATE)
//@Temporal(TemporalType.TIMESTAMP)
private Date dataUrodzenia;
@Enumerated(EnumType.STRING)
private Typ typ;
@Lob
String opisXML;
14Odwzorowania relacyjno-obiektowe Ograniczenia
@Length(min=, max=)
@Max(value=)
@Min(value=)
@Past
@Future
@Range(min=, max=)
@Size(min=, max=)
15Odwzorowania relacyjno-obiektowe @Version
@Version() private int optLock;
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)
)
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="";
....
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;
.....
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;
.......
}
20Odwzorowania relacyjno-obiektowe Unikalność danych
@Column(unique = true, length = 20)
private String login;
@Table(
name=”spotkania",
uniqueConstraints =
{@UniqueConstraint(columnNames={”miesiac", ”dzien"})}
)
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.
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
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
24Odwzorowania relacyjno-obiektowe Cykl życia (IV)
25Odwzorowania relacyjno-obiektowe
@Repository
public class UzytkownikDAOImpl implements UzytkownikDAO
{
@Autowired
protected SessionFactory sessionFactory;
......
Klasa DAO (I)
26Odwzorowania relacyjno-obiektowe
public class UzytkownikDAOImpl extends HibernateDaoSupport implements UzytkownikDAO
{
public void setHibernateSessionFactory(@Qualifier("hibernateSessionFactory") SessionFactory factory)
{
setSessionFactory(factory);
}
.....
Klasa DAO (II)
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)
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;
}
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);
}
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;
}
31Odwzorowania relacyjno-obiektowe Zapisywanie obiektu
public void persist(Uzytkownik u)
{
sessionFactory.getCurrentSession().persist(u);
}
public void save(Uzytkownik u)
{
sessionFactory.getCurrentSession().save(u);
}
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);
}
33Odwzorowania relacyjno-obiektowe Usuwanie obiektu
public void delete(Uzytkownik u)
{
sessionFactory.getCurrentSession().delete(u);
}
34Odwzorowania relacyjno-obiektowe
getSession()
getHibernateTemplate().getSessionFactory().getCurrentSession()
Pobieranie obiektu session