1 Sławomir Civic Białek [email protected] 2008-09-28 HIBERNATE
2 2 Plan prelekcji ● Czym jest Hibernate ● Konfiguracja i uruchomienie ● Najważnejsze klasy ● Klasy obiektów przechowywanych w bazie ● Podstawowe operacje ● Relacje ● Zapytania ● Co dalej?
3 3 Czym jest Hibernate ● ORM (Object-Relational Mapping) ● LGPL ● Java (oraz.NET) ● Plain Old Java Objects (POJO) ● Hibernate vs EJB3, JPA ● Pakiety: ● Core ● Annotations ● Tools ● (Entity Manager)
4 4 Czym jest Hibernate Źródło: www.hibernate.org
5 5 Czym jest Hibernate ● Dialekty: ● DB2 ● PostgreSQL ● MySQL ● Oracle ● Sybase ● MS SQL ● SAP DB ● Hypersonic SQL ● Interbase, Firebird
6 6 Konfiguracja i uruchomieni ● Wymagane: ● antlr.jar ● dom4j.jar ● commons-collections.jar ● javassist.jar ● jta.jar ● ejb3-persistence.jar ● slf4j-api.jar ● logback-core.jar ● logback-classic.jar ● hibernate3.jar (hibernate-core.jar) ● hibernate-annotations.jar ● hibernate-commons-annotations.jar ● postgresql-8.3-603.jdbc4.jar
7 7 Konfiguracja i uruchomienie org.postgresql.Driver jdbc:postgresql://localhost/jWAF postgres password org.hibernate.dialect.PostgreSQLDialect thread false create
8 8 Konfiguracja i uruchomienie ● Logowanie: false ${log.dir}/hibernate.log %date %level [%thread] %logger{10} [%file : %line] %msg%n ${log.arch.dir}/hibernate-%d{yyyy-MM-dd}.log
9 9 Konfiguracja i uruchomienie ● Logowanie:
10 10 Najważniejsze klasy ● AnnotationConfiguration / Configuration ● configure() ● buildSessionFactory() ● SessionFactory ● getCurrentSession() / openSession() ● Session ● beginTransaction() / getTransaction() ● Transaction ● begin() / commit() / rollback() ● Query / SQLQuery
11 11 Klasy POJO package model; import javax.persistence.*; import java.util.*; @Entity public class Uzytkownik { private long id; private String email; private String imie; private String nazwisko; private Set wiadomosciOd; private Set wiadomosciDo; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public long getId() { return id; } public void setId(long id) { this.id = id; } @org.hibernate.annotations.Type(type="text") public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @org.hibernate.annotations.Type(type="text") public String getImie() { return imie; } public void setImie(String imie) {this.imie = imie; } @org.hibernate.annotations.Type(type="text") public String getNazwisko() { return nazwisko; } public void setNazwisko(String nazwisko) { this.nazwisko = nazwisko; } @OneToMany(mappedBy = "uzytkownikOd") public Set getWiadomosciOd() { return wiadomosciOd; } public void setWiadomosciOd(Set wiadomosciOd) { this.wiadomosciOd = wiadomosciOd; } @OneToMany(mappedBy = "uzytkownikDo") public Set getWiadomosciDo() { return wiadomosciDo; } public void setWiadomosciDo(Set wiadomosciDo) { this.wiadomosciDo = wiadomosciDo; } }
12 12 Klasy POJO package model; import java.util.Date; import javax.persistence.*; import org.hibernate.annotations.ForeignKey; @Entity public class Wiadomosc { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private long id; @ManyToOne (fetch=FetchType.LAZY) @JoinColumn(name="uzytkownik_od_id") @ForeignKey(name="fk_uzytkownik_od_id") private Uzytkownik uzytkownikOd; @ManyToOne (fetch=FetchType.LAZY) @JoinColumn(name="uzytkownik_do_id") @ForeignKey(name="fk_uzytkownik_do_id") private Uzytkownik uzytkownikDo; @org.hibernate.annotations.Index(name="idx_datetime") private Date dateTime; @org.hibernate.annotations.Type(type="text") private String temat; @org.hibernate.annotations.Type(type="text") private String tresc; public long getId() { return id; } public void setId(long id) { this.id = id; } public Date getDateTime() { return dateTime; } public void setDateTime(Date dateTime) { this.dateTime = dateTime; } public String getTemat() { return temat; } public void setTemat(String temat) { this.temat = temat; } public String getTresc() { return tresc; } public void setTresc(String tresc) { this.tresc = tresc; } public Uzytkownik getUzytkownikOd() { return uzytkownikOd; } public void setUzytkownikOd(Uzytkownik uzytkownikOd) { this.uzytkownikOd = uzytkownikOd; } public Uzytkownik getUzytkownikDo() { return uzytkownikDo; } public void setUzytkownikDo(Uzytkownik uzytkownikDo) { this.uzytkownikDo = uzytkownikDo; } }
13 13 Podstawowe operacje sessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory(); Session session = factory.getCurrentSession(); Transaction t = session.beginTransaction(); ///..... t.commit(); ----------------------------- Uzytkownik user1 = new Uzytkownik(); user1.setImie(“...”); user1.setNazwisko(“...”); user1.setEmail(“...”); session.save(user1);
14 14 Podstawowe operacje Uzytkownik user = (Uzytkownik)session.get(Uzytkownik.class, (long)1); session.delete(user); ------------------------------- Uzytkownik user = (Uzytkownik)session.get(Uzytkownik.class, (long)1); user.setEmail(“[email protected]”);[email protected] user.save(); -------------------------------- Uzytkownik user1 = (Uzytkownik)session.get(Uzytkownik.class, (long)1); Uzytkownik user2 = (Uzytkownik)session.get(Uzytkownik.class, (long)2); Wiadomosc msg = new Wiadomosc(); msg.setTresc(“.....”); msg.setUzytkownikOd(user1); msg.setUzytkownikDo(user2); session.save(msg);
15 15 Zapytania ● Nawigacja po obiektach ● Uzytkownik od = wiadomosc.getUzytkownikOd() ● Wg klucza ● Wiadomosc msg = (Wiadomosc)session.get(Wiadomosc.class, (long)1); ● Hibernate Query Language (HQL) ● Hibernate Criteria API ● natywny SQL
16 16 Zapytania - HQL String queryString = "from Uzytkownik user where user.email like :searchString"; List result = session.createQuery(queryString).setString("searchString", “[email protected]”).list(); String queryString = "from Wiadomosc w where w.uzytkownikOd = :user"; List Result = session.createQuery(queryString).setEntity("user", user1).list(); String queryString = "from Wiadomosc w where w.uzytkownikOd = :user"; List result = session.createQuery(queryString).setParameter( "user", user1, Hibernate.entity(Uzytkownik.class) ).list(); ● Można stosować: operatory SQL, złączenia, agregacje, grupowanie. ● Nazwy klas, a nie tabel itd.
17 17 Zapytania – Criteria API session.createCriteria(Uzytkownik.class); Criterion emailEq = Expression.eq("email", "[email protected]"); Criteria crit = session.createCriteria(Uzytkownik.class); crit.add(emailEq); User user = (User) crit.uniqueResult(); session.createCriteria(Uzytkownik.class).add( Expression.isNull("email") ).list(); Criteria crit = session.createCriteria(Uzytkownik.class).add( Expression.and( Expression.like("imie", "A%"), Expression.in("nazwisko", nazwiska) ).addOrder( Order.asc("nazwisko") ).addOrder( Order.asc("imie") ).;
18 18 Co dalej? ● www.hibernate.org www.hibernate.org ● Hibernate In Action ● Transakcje ● Polimorfizm ● Optymalizacja ● Cache'owanie