SlideShare a Scribd company logo
JPA - Java Persistence API
Thomas Wöhlke
ObjectCode GmbH
12.03.2009
JPA: Agenda
© 2009 ObjectCode GmbH
Domain Object Model
© 2009 ObjectCode GmbH
Object-Relational Mapping
Analogie: OO  RDB
 Klasse  Tabelle
 Objekt  Zeile
 Variable Spalte
 Wert  Feld
Domain Object Modell = ERD ?
© 2009 ObjectCode GmbH
O/R Impedance Mismatch
© 2009 ObjectCode GmbH
O/R Impedance Mismatch
© 2009 ObjectCode GmbH
Domain Object Model: GLE
© 2009 ObjectCode GmbH
... und die Physik?
• v(Harddisk) << v(RAM)
• CPU 99% idle
• Process 99% IO_WAIT
• Page Impressions  SQL-Requests?
© 2009 ObjectCode GmbH
Anno Domini 2004...
© 2009 ObjectCode GmbH
© 2004-2005 TheServerside.com
Hibernate
Mapping von POJO‘s:
2. Java Bean API
3. Collection API (Generics)
4. Mapping:
XML oder Hibernate-Annotations
Hibernate ist ein JPA-Vendor:
 Hibernate-Core
 Hibernate-Annotations
 Hibernate Entity Manager
© 2009 ObjectCode GmbH
Von Hibernate nach JPA
© 2009 ObjectCode GmbH
JPA im JEE-Stack
© 2009 ObjectCode GmbH
persistence.xml (Java EE)
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="JPM_DB">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/JpmDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.show_sql" value="true"/>
<!-- These are the default for JBoss EJB3, but not for HEM: -->
<property name="hibernate.cache.provider_class"
value="org.hibernate.cache.HashtableCacheProvider"/>
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
</properties>
</persistence-unit>
</persistence>
© 2009 ObjectCode GmbH
persistence.xml (Java SE)
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="JPM_DB">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>org.woehlke.projecteering.kernel.calendar.pao.Day</class>
<class>org.woehlke.projecteering.kernel.minutes.pao.Event</class>
<class>org.woehlke.projecteering.kernel.minutes.pao.Minutes</class>
<class>org.woehlke.projecteering.kernel.minutes.pao.MinutesItem</class>
<class>org.woehlke.projecteering.kernel.projects.pao.Project</class>
<class>org.woehlke.projecteering.kernel.projects.pao.ProjectCategory</class>
<class>org.woehlke.projecteering.kernel.timerecording.pao.TimeRecordingItem</class>
<class>org.woehlke.projecteering.kernel.userrights.pao.Company</class>
<class>org.woehlke.projecteering.kernel.userrights.pao.Team</class>
<class>org.woehlke.projecteering.kernel.userrights.pao.User</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.generate_statistics" value="true"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="jpm"/>
<property name="hibernate.connection.password" value="jpmpwd"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpm"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
</properties>
</persistence-unit>
</persistence>
© 2009 ObjectCode GmbH
Mapping der Klassen 1
public class Customer extends Person {
@OneToMany(mappedBy=“purchaser”) Set<Order> orders =
new HashSet<Order>();
protected Customer() { } // for loading from db
public Customer(String fname, String lname) {
super(fname, lname);
}
public void addOrder(Order o) { orders.add(o); }
public Set<Order> getOrders() { return orders; }
}
© 2009 ObjectCode GmbH
Mapping der Klassen 2
@Entity
@Table(name=“PRODUCTS”)
public class Product {
@Id @GeneratedValue
@Column(name=“PRODUCT_PK”)
long id;
@Version int oplock; // column defaults to “OPLOCK”
String name; // column defaults to “NAME”
@ManyToOne
@JoinColumn(name=“SUPP_FK”,
referencedColumnName=“SUPP_PK”)
Supplier supplier;
...
}
© 2009 ObjectCode GmbH
Mapping der Assoziationen
Kardinalität:
 1:1  OneToOne
 1:n  OneToMany
 n:m  ManyToMany
Richtung:
 1:n -> OneToMany
 N:1 <- ManyToOne
Sichtbarkeit:
 Unidirektional ->
 Bidirektional <->
© 2009 ObjectCode GmbH
Mapping der Vererbung
2. Eine Tabelle pro Klassen-Hierarchie
3. Eine Tabelle pro konkrete Klasse
4. Eine Tabelle pro Subklasse
5. Non-Entity Vererbung
6. Keine Vererbung: Embbeding
© 2009 ObjectCode GmbH
Mapping der Vererbung?
© 2009 ObjectCode GmbH
Einsatz von JPA im JBoss/EJB3
@Stateless
public class MinutesItemDao extends BaseDao<MinutesItem> implements
IMinutesItemDao {
@PersistenceContext(unitName = "JPM_DB")
private EntityManager entityManager;
public MinutesItem findById(Long id) {
return entityManager.find(MinutesItem.class,id);
}
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}
© 2009 ObjectCode GmbH
Einsatz von JPA in Spring/Tomcat
@Transactional
public class MinutesDao extends BaseDao<Minutes> implements
IMinutesDao {
public Minutes findById(Long id) {
return jpaTemplate.find(Minutes.class,id);
}
}
© 2009 ObjectCode GmbH
EJB-QL
Query q = em.createQuery(“select c from Customer c where c.firstName
= :fname order by c.lastName”);
q.setParameter(“fname”, “Joe”);
q.setFirstResult(20);
q.setMaxResults(10);
List<Customer> customers = (List<Customer>) q.getResultList();
// all orders, as a named query
@Entity
@NamedQuery(name=“Order:findAllOrders”,
query=“select o from Order o”);
public class Order { ... }
Query q = em.createNamedQuery(“Order:findAllOrders”);
© 2009 ObjectCode GmbH
Lebenszyklus Persistente Objekte
2. Neu, transient (@Id id == null)
3. Persistent (@Id id != null)
4. Detached:
– Wie persistent (@Id id!= null)
– Jedoch ausserhalb des EntityManager Kontext
– Lazy Loading nicht möglich!
– Änderungen in DB sichern mit merge
© 2009 ObjectCode GmbH
EJB-QL
// all people, via a custom SQL statement
Query q = em.createNativeQuery(“SELECT ID, VERSION, SUBCLASS,
FIRSTNAME, LASTNAME FROM PERSON”, Person.class);
List<Person> people = (List<Person>) q.getResultList();
// single-result aggregate: average order total price
Query q = em.createQuery(“select avg(i.price) from Item i”);
Number avgPrice = (Number) q.getSingleResult();
// traverse to-many relations
Query q = em.createQuery(“select o from Order o left join o.items li where
li.price > :price”);
q.setParameter(“price”, 1000);
List<Order> orders = (List<Order>) q.getResultList();
© 2009 ObjectCode GmbH
Lazy Loading
• Supplier s = order.getItem().getProduct().getSupplier();
• Bei Aufruf eines Getters wird Objekt aus DB-Zeile nachgeladen.
• Ohne Lazy Loading muss komplettes Objekt-Netz geladen werden.
• Struktur des Objekt-Netzes variiert je nach Web-View
© 2009 ObjectCode GmbH
DAO und „Unit of Work“
© 2009 ObjectCode GmbH
Ausblick: Seam
• Kern-Entwickler von Hibernate sind nun im
Seam-Projekt
• O/R-Mapping von EJB3/JPA auch für die
Webapplikation
• OO im Datenbankbackend durch ORM
• OO im Webfrontend durch JSF
• Im Conversation-Scope ist Lazy-Loading möglich.
• Detached Objects können für die Webview
verwendet werden: Kein DTO-Antipattern
© 2009 ObjectCode GmbH
RTFM: http://www.hibernate.org/
O‘Reilly: Enterprise JavaBeans 3.0
Manning: EJB3 in Action
Manning: Hibernate in Action
Literatur
© 2009 ObjectCode GmbH
FRAGEN? Fragen!
... Vielen Dank
für die Aufmerksamkeit
© 2009 ObjectCode GmbH

More Related Content

PPSX
Exception Handling
PPT
Labels and buttons
PDF
Lets make a better react form
PPT
Character stream classes introd .51
PPTX
Introduction to Java Programming
PPTX
Tanel Poder Oracle Scripts and Tools (2010)
PPT
Java IO Package and Streams
PDF
Testing with JUnit 5 and Spring
Exception Handling
Labels and buttons
Lets make a better react form
Character stream classes introd .51
Introduction to Java Programming
Tanel Poder Oracle Scripts and Tools (2010)
Java IO Package and Streams
Testing with JUnit 5 and Spring

What's hot (20)

PPTX
[OOP - Lec 08] Encapsulation (Information Hiding)
KEY
Ch6 file, saving states, and preferences
PPTX
Spring data jpa
PPTX
Introduction to java
PDF
Circuit breakers - Using Spring-Boot + Hystrix + Dashboard + Retry
PPT
Java-java virtual machine
PPT
Class and Objects in PHP
PPTX
Classes in c++ (OOP Presentation)
PPTX
Introduction to EJB
PPTX
Constructor ppt
PPTX
Advanced JavaScript
PPT
Data Storage In Android
PDF
Serial Killer - Silently Pwning your Java Endpoints // OWASP BeNeLux Day 2016
PPTX
ReadConcern and WriteConcern
ODP
Multithreading In Java
PPT
Java platform
PDF
Java 8 Lambda Expressions
PPTX
Exceptionhandling
PDF
톰캣 운영 노하우
DOCX
JDK,JRE,JVM
[OOP - Lec 08] Encapsulation (Information Hiding)
Ch6 file, saving states, and preferences
Spring data jpa
Introduction to java
Circuit breakers - Using Spring-Boot + Hystrix + Dashboard + Retry
Java-java virtual machine
Class and Objects in PHP
Classes in c++ (OOP Presentation)
Introduction to EJB
Constructor ppt
Advanced JavaScript
Data Storage In Android
Serial Killer - Silently Pwning your Java Endpoints // OWASP BeNeLux Day 2016
ReadConcern and WriteConcern
Multithreading In Java
Java platform
Java 8 Lambda Expressions
Exceptionhandling
톰캣 운영 노하우
JDK,JRE,JVM
Ad

Similar to JPA - Java Persistence API (20)

PPTX
Jpa queries
PPT
test for jpa spring boot persistence hehe
PPT
jpa-hibernate-presentation
PPTX
HIBERNATE For Databases java presentation.pptx
PDF
Java persistence api 2.1
ODP
Java Persistence API
PDF
New Features of JSR 317 (JPA 2.0)
PDF
Kick Start Jpa
PDF
PPT
Entity Persistence with JPA
PDF
Understanding
PDF
Using the latest Java Persistence API 2.0 features
PPT
Java persistence api
PDF
Using the latest Java Persistence API 2 Features - Tech Days 2010 India
PDF
20160523 hibernate persistence_framework_and_orm
ODP
Jpa buenas practicas
ODP
JPA Best Practices
PPT
PPTX
JPA For Beginner's
PDF
2014 Pre-MSc-IS-3 Persistence Layer
Jpa queries
test for jpa spring boot persistence hehe
jpa-hibernate-presentation
HIBERNATE For Databases java presentation.pptx
Java persistence api 2.1
Java Persistence API
New Features of JSR 317 (JPA 2.0)
Kick Start Jpa
Entity Persistence with JPA
Understanding
Using the latest Java Persistence API 2.0 features
Java persistence api
Using the latest Java Persistence API 2 Features - Tech Days 2010 India
20160523 hibernate persistence_framework_and_orm
Jpa buenas practicas
JPA Best Practices
JPA For Beginner's
2014 Pre-MSc-IS-3 Persistence Layer
Ad

More from Thomas Wöhlke (7)

PPTX
Stahlkirche Otto Bartning 1928
PPTX
Pierre Bourdieu - Elemente einer soziologischen Theorie der Kunstwahrnehmung
PDF
Treesort Algorithmus und Datenstruktur
PDF
Produkt und Unternehmens Vorstellung in der Berufsschule
PDF
OO Methodik für eCommerce-Engineering und -Consulting mit UML
PDF
Zeitmanagement - Referat
PPTX
Max Imdahl Ikonik
Stahlkirche Otto Bartning 1928
Pierre Bourdieu - Elemente einer soziologischen Theorie der Kunstwahrnehmung
Treesort Algorithmus und Datenstruktur
Produkt und Unternehmens Vorstellung in der Berufsschule
OO Methodik für eCommerce-Engineering und -Consulting mit UML
Zeitmanagement - Referat
Max Imdahl Ikonik

Recently uploaded (20)

PPTX
lesson6-211001025531lesson plan ppt.pptx
PPT
First Aid Training Presentation Slides.ppt
PPTX
_ISO_Presentation_ISO 9001 and 45001.pptx
PPTX
Project and change Managment: short video sequences for IBA
PPTX
Primary and secondary sources, and history
PPT
The Effect of Human Resource Management Practice on Organizational Performanc...
PPTX
Tour Presentation Educational Activity.pptx
PPTX
nose tajweed for the arabic alphabets for the responsive
PPTX
worship songs, in any order, compilation
PPTX
Human Mind & its character Characteristics
PDF
Parts of Speech Prepositions Presentation in Colorful Cute Style_20250724_230...
PPTX
Self management and self evaluation presentation
DOCX
ENGLISH PROJECT FOR BINOD BIHARI MAHTO KOYLANCHAL UNIVERSITY
PPTX
Introduction to Effective Communication.pptx
PDF
Swiggy’s Playbook: UX, Logistics & Monetization
PPTX
INTERNATIONAL LABOUR ORAGNISATION PPT ON SOCIAL SCIENCE
PPTX
Presentation for DGJV QMS (PQP)_12.03.2025.pptx
PPTX
Tablets And Capsule Preformulation Of Paracetamol
PPTX
ART-APP-REPORT-FINctrwxsg f fuy L-na.pptx
PPTX
Intro to ISO 9001 2015.pptx wareness raising
lesson6-211001025531lesson plan ppt.pptx
First Aid Training Presentation Slides.ppt
_ISO_Presentation_ISO 9001 and 45001.pptx
Project and change Managment: short video sequences for IBA
Primary and secondary sources, and history
The Effect of Human Resource Management Practice on Organizational Performanc...
Tour Presentation Educational Activity.pptx
nose tajweed for the arabic alphabets for the responsive
worship songs, in any order, compilation
Human Mind & its character Characteristics
Parts of Speech Prepositions Presentation in Colorful Cute Style_20250724_230...
Self management and self evaluation presentation
ENGLISH PROJECT FOR BINOD BIHARI MAHTO KOYLANCHAL UNIVERSITY
Introduction to Effective Communication.pptx
Swiggy’s Playbook: UX, Logistics & Monetization
INTERNATIONAL LABOUR ORAGNISATION PPT ON SOCIAL SCIENCE
Presentation for DGJV QMS (PQP)_12.03.2025.pptx
Tablets And Capsule Preformulation Of Paracetamol
ART-APP-REPORT-FINctrwxsg f fuy L-na.pptx
Intro to ISO 9001 2015.pptx wareness raising

JPA - Java Persistence API

  • 1. JPA - Java Persistence API Thomas Wöhlke ObjectCode GmbH 12.03.2009
  • 2. JPA: Agenda © 2009 ObjectCode GmbH
  • 3. Domain Object Model © 2009 ObjectCode GmbH
  • 4. Object-Relational Mapping Analogie: OO  RDB  Klasse  Tabelle  Objekt  Zeile  Variable Spalte  Wert  Feld Domain Object Modell = ERD ? © 2009 ObjectCode GmbH
  • 5. O/R Impedance Mismatch © 2009 ObjectCode GmbH
  • 6. O/R Impedance Mismatch © 2009 ObjectCode GmbH
  • 7. Domain Object Model: GLE © 2009 ObjectCode GmbH
  • 8. ... und die Physik? • v(Harddisk) << v(RAM) • CPU 99% idle • Process 99% IO_WAIT • Page Impressions  SQL-Requests? © 2009 ObjectCode GmbH
  • 9. Anno Domini 2004... © 2009 ObjectCode GmbH © 2004-2005 TheServerside.com
  • 10. Hibernate Mapping von POJO‘s: 2. Java Bean API 3. Collection API (Generics) 4. Mapping: XML oder Hibernate-Annotations Hibernate ist ein JPA-Vendor:  Hibernate-Core  Hibernate-Annotations  Hibernate Entity Manager © 2009 ObjectCode GmbH
  • 11. Von Hibernate nach JPA © 2009 ObjectCode GmbH
  • 12. JPA im JEE-Stack © 2009 ObjectCode GmbH
  • 13. persistence.xml (Java EE) <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="JPM_DB"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:/JpmDS</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.show_sql" value="true"/> <!-- These are the default for JBoss EJB3, but not for HEM: --> <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/> </properties> </persistence-unit> </persistence> © 2009 ObjectCode GmbH
  • 14. persistence.xml (Java SE) <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="JPM_DB"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>org.woehlke.projecteering.kernel.calendar.pao.Day</class> <class>org.woehlke.projecteering.kernel.minutes.pao.Event</class> <class>org.woehlke.projecteering.kernel.minutes.pao.Minutes</class> <class>org.woehlke.projecteering.kernel.minutes.pao.MinutesItem</class> <class>org.woehlke.projecteering.kernel.projects.pao.Project</class> <class>org.woehlke.projecteering.kernel.projects.pao.ProjectCategory</class> <class>org.woehlke.projecteering.kernel.timerecording.pao.TimeRecordingItem</class> <class>org.woehlke.projecteering.kernel.userrights.pao.Company</class> <class>org.woehlke.projecteering.kernel.userrights.pao.Team</class> <class>org.woehlke.projecteering.kernel.userrights.pao.User</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.generate_statistics" value="true"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> <property name="hibernate.connection.username" value="jpm"/> <property name="hibernate.connection.password" value="jpmpwd"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpm"/> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> </properties> </persistence-unit> </persistence> © 2009 ObjectCode GmbH
  • 15. Mapping der Klassen 1 public class Customer extends Person { @OneToMany(mappedBy=“purchaser”) Set<Order> orders = new HashSet<Order>(); protected Customer() { } // for loading from db public Customer(String fname, String lname) { super(fname, lname); } public void addOrder(Order o) { orders.add(o); } public Set<Order> getOrders() { return orders; } } © 2009 ObjectCode GmbH
  • 16. Mapping der Klassen 2 @Entity @Table(name=“PRODUCTS”) public class Product { @Id @GeneratedValue @Column(name=“PRODUCT_PK”) long id; @Version int oplock; // column defaults to “OPLOCK” String name; // column defaults to “NAME” @ManyToOne @JoinColumn(name=“SUPP_FK”, referencedColumnName=“SUPP_PK”) Supplier supplier; ... } © 2009 ObjectCode GmbH
  • 17. Mapping der Assoziationen Kardinalität:  1:1  OneToOne  1:n  OneToMany  n:m  ManyToMany Richtung:  1:n -> OneToMany  N:1 <- ManyToOne Sichtbarkeit:  Unidirektional ->  Bidirektional <-> © 2009 ObjectCode GmbH
  • 18. Mapping der Vererbung 2. Eine Tabelle pro Klassen-Hierarchie 3. Eine Tabelle pro konkrete Klasse 4. Eine Tabelle pro Subklasse 5. Non-Entity Vererbung 6. Keine Vererbung: Embbeding © 2009 ObjectCode GmbH
  • 19. Mapping der Vererbung? © 2009 ObjectCode GmbH
  • 20. Einsatz von JPA im JBoss/EJB3 @Stateless public class MinutesItemDao extends BaseDao<MinutesItem> implements IMinutesItemDao { @PersistenceContext(unitName = "JPM_DB") private EntityManager entityManager; public MinutesItem findById(Long id) { return entityManager.find(MinutesItem.class,id); } public EntityManager getEntityManager() { return entityManager; } public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } } © 2009 ObjectCode GmbH
  • 21. Einsatz von JPA in Spring/Tomcat @Transactional public class MinutesDao extends BaseDao<Minutes> implements IMinutesDao { public Minutes findById(Long id) { return jpaTemplate.find(Minutes.class,id); } } © 2009 ObjectCode GmbH
  • 22. EJB-QL Query q = em.createQuery(“select c from Customer c where c.firstName = :fname order by c.lastName”); q.setParameter(“fname”, “Joe”); q.setFirstResult(20); q.setMaxResults(10); List<Customer> customers = (List<Customer>) q.getResultList(); // all orders, as a named query @Entity @NamedQuery(name=“Order:findAllOrders”, query=“select o from Order o”); public class Order { ... } Query q = em.createNamedQuery(“Order:findAllOrders”); © 2009 ObjectCode GmbH
  • 23. Lebenszyklus Persistente Objekte 2. Neu, transient (@Id id == null) 3. Persistent (@Id id != null) 4. Detached: – Wie persistent (@Id id!= null) – Jedoch ausserhalb des EntityManager Kontext – Lazy Loading nicht möglich! – Änderungen in DB sichern mit merge © 2009 ObjectCode GmbH
  • 24. EJB-QL // all people, via a custom SQL statement Query q = em.createNativeQuery(“SELECT ID, VERSION, SUBCLASS, FIRSTNAME, LASTNAME FROM PERSON”, Person.class); List<Person> people = (List<Person>) q.getResultList(); // single-result aggregate: average order total price Query q = em.createQuery(“select avg(i.price) from Item i”); Number avgPrice = (Number) q.getSingleResult(); // traverse to-many relations Query q = em.createQuery(“select o from Order o left join o.items li where li.price > :price”); q.setParameter(“price”, 1000); List<Order> orders = (List<Order>) q.getResultList(); © 2009 ObjectCode GmbH
  • 25. Lazy Loading • Supplier s = order.getItem().getProduct().getSupplier(); • Bei Aufruf eines Getters wird Objekt aus DB-Zeile nachgeladen. • Ohne Lazy Loading muss komplettes Objekt-Netz geladen werden. • Struktur des Objekt-Netzes variiert je nach Web-View © 2009 ObjectCode GmbH
  • 26. DAO und „Unit of Work“ © 2009 ObjectCode GmbH
  • 27. Ausblick: Seam • Kern-Entwickler von Hibernate sind nun im Seam-Projekt • O/R-Mapping von EJB3/JPA auch für die Webapplikation • OO im Datenbankbackend durch ORM • OO im Webfrontend durch JSF • Im Conversation-Scope ist Lazy-Loading möglich. • Detached Objects können für die Webview verwendet werden: Kein DTO-Antipattern © 2009 ObjectCode GmbH
  • 28. RTFM: http://www.hibernate.org/ O‘Reilly: Enterprise JavaBeans 3.0 Manning: EJB3 in Action Manning: Hibernate in Action Literatur © 2009 ObjectCode GmbH
  • 29. FRAGEN? Fragen! ... Vielen Dank für die Aufmerksamkeit © 2009 ObjectCode GmbH