1 / 23

Object/Relational Mapping with Hibernate

Object/Relational Mapping with Hibernate. Kloskowski Dominik. Współczesne rozwiązania problemu ORM. „ Transparent Persistence ” (POJO/JavaBeans) (przezroczysta trwałość dla użytkownika) Persistent/transient instances (trwałe/przechodnie wystąpienie obiektu) Automatyczne „ Dirty Checking ”

Download Presentation

Object/Relational Mapping with Hibernate

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Object/Relational Mapping with Hibernate Kloskowski Dominik

  2. Współczesne rozwiązania problemu ORM • „Transparent Persistence” (POJO/JavaBeans) (przezroczysta trwałość dla użytkownika) • Persistent/transient instances(trwałe/przechodnie wystąpienie obiektu) • Automatyczne„Dirty Checking” (brudne sprawdzanie ) • „Transitive Persistence” (przechodnia trwałość) • „Lazy Fetching” (leniwe pobieranie ) • „Outer Join Fetching” (zewnętrzne złączenia) • Runtime SQL Generation • Trzy podstawowe sposoby dziedziczenia

  3. Relacyjne bazy – co dobrego ? • Zarządzanie dużymi ilościami danych • wyszukiwanie, sortowanie • Zarządzanie grupami danych • Łączenie, agregacja • Współużytkowanie • Współbieżność (transakcje) • Iintegralność • Więzy integralności • Izolacja transakcji

  4. Relacyjne bazy – co złego ? • niezgodność modelu pojęciowego z modelem implementacyjnym • brak środków hermetyzacji i modularyzacji (brak oddzielenia implementacji od specyfikacji) • brak środków do przechowywania informacji proceduralnych • rozszerzalność (brak ?)

  5. Rozwiązanie • Skorzystać z zalet relacyjnych baz danych • Jednocześnie nie rezygnując z obiektowości

  6. Hibernate • Open source (LGPL) • Dojrzały • Popularny (13 000 pobrań/miesiąc) • Własne API • Będzie wykorzystane w JBoss CMP 2.0 engine

  7. Hibernate • Trwałość dla JavaBeans • Wsparcie dla bardzo rozwiniętych modeli obiektowych • Rozbudowane zapytania • Jeden krok dalej od zwykłego wykorzystania JDBC

  8. Przykład - Auction Object Model

  9. Domyślny konstruktor Gety/Sety Identyfikator obiektu public class AuctionItem { private Long _id; private Set _bids; private Bid _successfulBid private String _description; public Long getId() { return _id; } private void setId(Long id) { _id = id; } public String getDescription() { return _description; } public void setDescription(String desc) { _description=desc; } … } Przykład - Persistent Class

  10. <class name=“AuctionItem” table=“AUCTION_ITEM”> <id name=“id” column=“ITEM_ID”> <generator class=“native”/> </id> <property name=“description” column=“DESCR”/> <many-to-one name=“successfulBid” column=“SUCCESSFUL_BID_ID”/> <set name=“bids” cascade=“all” lazy=“true”> <key column=“ITEM_ID”/> <one-to-many class=“Bid”/> </set> </class> Przykład - XML Mapping

  11. PobierzAuctionItem i zmień description Session session = sessionFactory.openSession(); Transaction tx = s.beginTransaction(); AuctionItem item = (AuctionItem) session.get(ActionItem.class, itemId); item.setDescription(newDescription); tx.commit(); session.close(); Dirty Checking

  12. Pobierz AuctionItem i stwórz nowy trwały obiekt Bid Bid bid = new Bid(); bid.setAmount(bidAmount); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); AuctionItem item = (AuctionItem) session.get(ActionItem.class, itemId); bid.setItem(item); item.getBids().add(bid); tx.commit(); session.close(); Transitive Persistence

  13. Pobierz AuctionItem i stwórz nowy trwały obiekt Bid Session session = sf.openSession(); Transaction tx = session.beginTransaction(); AuctionItem item = (AuctionItem) session.get(ActionItem.class, itemId); tx.commit(); session.close(); item.setDescription(newDescription); Session session2 = sf.openSession(); Transaction tx = session2.beginTransaction(); session2.update(item); tx.commit(); session2.close(); Detachment

  14. Lazy Fetching Eager (Outer Join) Fetching Batch Fetching Optymalizacja zarządzania danymi

  15. AuctionItem item = (AuctionItem) session.get(ActionItem.class, itemId); SELECT … FROM AUCTION_ITEM ITEM WHERE ITEM.ITEM_ID = ? Iterator iter = item.getBids().iterate(); SELECT … FROM BID BID WHERE BID.ITEM_ID = ? item.getSuccessfulBid().getAmount(); SELECT … FROM BID BID WHERE BID.BID_ID = ? Transparent Lazy Fetching

  16. <class name=“AuctionItem” table=“AUCTION_ITEM”> <id name=“id” column=“ITEM_ID”> <generator class=“native”/> </id> <property name=“description” column=“DESC”/> <many-to-one name=“successfulBid” outer-join=“true” column=“SUCCESSFUL_BID_ID”/> <set name=“bids” cascade=“all” outer-join=“true”> <key column=“ITEM_ID”/> <one-to-many class=“Bid”/> </set> </class> Outer Join Fetching

  17. AuctionItem item = (AuctionItem) s.get(ActionItem.class, itemId); SELECT … FROM AUCTION_ITEM ITEM LEFT OUTER JOIN BID BID1 ON BID1.ITEM_ID = ITEM.ITEM_ID LEFT OUTER JOIN BID BID2 ON BID2.BID_ID = ITEM.SUCCESSFUL_BID WHERE ITEM.ITEM_ID = ? Outer Join Fetching

  18. Minimalizowanie odczytywanych wierszy lazy fetching Minimalizowanie odwołań do bazy outer join fetching Minimalizowanie odczytywanych kolumn (mniej ważne) Optymalizacja zarządzania danymi (podsumowanie)

  19. „Hibernate Query Language” • Do możliwości SQL-a dodaje obiektowość • Klasyiwłaściwościzamiast tabel i kolumn • Polimorfizm • Asocjacje • Znacznie mniej rozwlekły niż SQL • Pełne wsparcie dla operacji typowo relacyjnych • Złączenia • Projekcja(rzut) • Agregacja (max, avg) i grupowanie • Ordering • Podzapytania • Wywoływanie funkcji SQL-a

  20. Hibernate Query Language • pobierz wszystkie „AuctionItems”: List allAuctions = session.createQuery(“from AuctionItem”).list(); • pobierz wszystkie „AuctionItems” gdzie Bid.amount > 100 i description zaczyna się przedrostkiem „hib”. select item from AuctionItem item join item.bids bid where item.description like ‘hib%’ and bid.amount > 100

  21. Przykłady zapytań AuctionItem item = new AuctionItem(); item.setDescription(“hib”); Bid bid = new Bid(); bid.setAmount(1.0); List auctionItems = session.createCriteria(AuctionItem.class) .add( Example.create(item).enableLike(MatchMode.START) ) .createCriteria(“bids”) .add( Example.create(bid) ) .list(); Odpowiednik w HQL: from AuctionItem item join item.bids bid where item.description like ‘hib%’ and bid.amount > 1.0

  22. Hibernate Info • http://hibernate.org • Hibernate in Action (Manning, 2004) • Tool support • http://xdoclet.sf.net • http://boss.bekk.no/boss/middlegen • http://www.andromda.org/

  23. Źródła • http://hibernate.org • Prezentacja Gavina Kinga na temat Hibernate

More Related