Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Advanced Topics Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.

Ähnliche Präsentationen


Präsentation zum Thema: "Advanced Topics Persistente Domänenmodelle mit JPA 2.0 und Bean Validation."—  Präsentation transkript:

1 Advanced Topics Persistente Domänenmodelle mit JPA 2.0 und Bean Validation

2 SQL Queries EntityManager.createNativeQuery(String sql) EntityManager.createNativeQuery(String sql, Class resultClass) Kann auch als NamedQuery definiert werden: Ausführen des NamedQueries und Parameterübergabe: 2 @NamedNativeQuery( name = "employeeReporting", query = "SELECT * FROM emp WHERE id = ?", resultClass = Employee.class) Query q = em.createNamedQuery("employeeReporting"); q.setParameter(1, employeeId); q.getResultList()

3 Result Set Mapping (1) Definition Verwendung 3 @SqlResultSetMapping( name = "employeeResult", entities = @EntityResult(entityClass = Employee.class) Query q = em.createNativeQuery( "SELECT * FROM EMPLOYEE", "employeeResult");

4 Result Set Mapping (2) Mapping Foreign Keys Wenn die Foreign Keys im Resultat der Abfrage enthalten sind, werden die einfachen Beziehungen ebenfalls mitgeführt Multiple Result Mapping SELECT e.*, a.* FROM emp e, address a WHERE e.adress_id = a.id 4 @SqlResultSetMapping( name = "EmployeeWithAddress", entities = {@EntityResult(entityClass = Employee.class), @EntityResult(entityClass = Address.class)}

5 Result Set Mapping (3) Mapping Inheritance SELECT id, name, start_date, daily_rate, term, vacation, hourly_rate, salary, pension, type FROM employee_stage 5 @SqlResultSetMapping( name="EmployeeStageMapping", entities= @EntityResult( entityClass=Employee.class, discriminatorColumn="TYPE", fields={ @FieldResult(name="startDate",column="START_DATE"), @FieldResult(name="dailyRate",column="DAILY_RATE"), @FieldResult(name="hourlyRate",column="HOURLY_RATE") } ) )

6 Lifecycle Callbacks Callbacks sind eine gängige Methode, um Einfluss auf den Lade- oder Speichervorgang von Objekten zu nehmen. Mögliche Events: PrePersist, PostPersist, PreRemove, PostRemove, PreUpdate, PostUpdate, PostLoad 6 @Entity public class ImageMessage extends Message { @PrePersist @PreUpdate protected void compress(){... } @PostLoad @PostUpdate protected void uncompress() {... }

7 Entity Listeners Wenn Sie dieselbe Funktionalität bei Callbacks von verschiedenen Entities verweden wollen, können Sie einen Entity Listener erstellen: Entity Listener verwenden: 7 public class BaseEntityDebugListener { @PrePersist public void debugPrePersist(BaseEntity e) { log.debug("PrePresist: " + e); } } @Entity @EntityListeners({BaseEntityDebugListener.class}) public class Employee extends BaseEntity

8 Vererbung und Lifecycle Events 1.Prüfen ob Default Listeners existieren 2.Höchste Ebene der Vererbung auf @EntityListeners Annotations prüfen 3.Wiederhole Schritt 2 für die nächst tiefere Ebene 4.Höchste Ebene der Vererbung auf Methoden mit zum Event passender Annotation prüfen 5.Wiederhole Schritt 4 für die nächst tiefere Ebene 8

9 Sperrzeitpunkt Daten werden in der Datenbank im Rahmen von SQL-Befehlen gesperrt. Da Änderungen vorerst lokal durchgeführt und erst zum Commit-Zeitpunkt in die DB propagiert werden, findet das Sperren erst beim Commit statt. Allfällige Wartesituationen, Deadlocks, Integritätsverletzungen treten effektiv erst zum Commit-Zeitpunkt auf. 9

10 Optimistic Locking / Versionierung Die Versionierung im Rahmen von JPA ist als optimistsches Locking zu verstehen. Mit der Versionierung kann ein Concurrency Control über Transaktionen hinweg realisiert werden. Mit einer @Version können Lost Updates detektiert und vermieden werden: Das Feld kann int, Integer, short, Short, long, Long oder java.sql.Timestamp sein 10 @Entity public class Employee { @Version protected long version;... create table emp ( version bigint not null,...

11 Weitere Locking Strategien Soll REPEATABLE_READ zur Anwendung kommen, kann Read Locking verwendet werden: em.lock(LockModeType.READ) Um eine Entität zum Schreiben zu sperren, wird Write Locking verwendet em.lock(LockModeType.WRITE) Die Verwendung von anderen Isolationlevels, muss über die JDBC Connection erfolgen 11

12 Enhanced Locking (JPA 2.0) JPA 2.0 führt neue Lockingstrategien ein: OPTIMISTIC ( = READ ) OPTIMISTIC_FORCE_INCREMENT ( = WRITE ) PESSIMISTIC_READ Repeatable Read PESSIMISTIC_WRITE Serialized PESSIMISTIC_FORCE_INCREMENT -> With version field Kombination Opitmistic/Pessimistic möglich! 12

13 13 Enhanced Locking (JPA 2.0) Example in EntityManager.refresh() public void applyCharges() { Account acct = em.find(Account.class, acctId); // calculate charges, etc. int charge = … ; if (charge > 0) { em.refresh(acct, PESSIMISTIC_WRITE); double balance = acct.getBalance(); acct.setBalance(balance - charge); }

14 Schema Generation Die Erzeugung von DDL kann, aber muss nicht durch eine Implementation der JPA Spezifikation angeboten werden. In der JPA Spezifikation sind verschiedene Angaben (Annotations und Attribute davon) vorgesehen, welche die Erzeugung von DDL-Befehlen ermöglichen 14 public class Message { @Column (unique = false, nullable=false, columnDefinition="varchar", lenghth=64 ) public BigDecimal sender;

15 Aufgabe: Advanced Topics 1.Erstellen Sie ein Result Set Mapping für ein SQL Query 2.Erweiteren Sie die BaseEntity um die Attribute createdAt und updatedAt und verwenden Sie Lifecycle Callbacks, um diese Attribute vor dem Insert und Update entsprechend abzufüllen 3.Erweitern Sie Ihre BaseEntity mit Optimistic Locking und testen Sie das Verhalten 4.Erweitern Sie ihr Mapping an beliebiger Stelle mit Angaben zur Schema Generierung (@Column) 15

16 16 XML Mapping

17 The Metadata Puzzle Reihenfolge bei der Verarbeitung der Metadaten: 1.Annotations verarbeiten 2.Klassen aus XML Mapping hinzufügen 3.Attribute aus XML Mapping hinzufügen 4.Defaultwerte setzen 17

18 Das Mapping File Rootelement is entity-mappings: 18 <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance" xsi:schemaLocation= "http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd" version="2.0">

19 Defaults im Mapping File Annotations ausschalten Persistence Unit Defaults schema catalog access cascade-persist entity-listeners Diese können auch ausgeschaltet werden exclude-default-listeners @ExcludeDefaultListeners 19

20 Defaults im Mapping File Mapping File Defaults package schema catalog access 20

21 Queries und Generators sequence-generator table-generator named-query named-native-query sql-result-set-mapping 21

22 Entity Mapping mit XML 22

23 23 Packaging and Deployment

24 Configuring Persistence Units Persistence Unit Name Transaction Type RESOURCE_LOCAL oder JTA Persistence Provider org.hibernate.ejb.HibernatePersistence Data Source nur bei JTA Mapping Files META-INF/queries.xml 24

25 Managed Classes Lokale Klassen Alle annotierten Klassen im Deployment Unit in welcher das persistence.xml gepackt ist Klassen in Mapping Files Mit XML gemappte Klassen Explicitly Listed Classes Im persistence.xml eingetragene Klassen Zusätzliche JARs mit Managed Classes Im persistence.xml unter jar-file eingetragene JARs 25

26 Properites zur Laufzeit übergeben Die properties im persistence.xml können ebenfalls zur Laufzeit beim Erstellen der EntityManagerFactory übergeben werden: 26 Map props = new HashMap(); props.put("toplink.jdbc.user", "emp"); props.put("toplink.jdbc.password", "emp"); EntityManagerFactory emf = Persistence.createEntityManagerFactory("EmployeeService", props);

27 27 Tools

28 IDE Integration Eclipse Projekt DALI Oracle Enterprise Pack for Eclipse JBoss Tools NetBeans IntelliJ IDEA 28


Herunterladen ppt "Advanced Topics Persistente Domänenmodelle mit JPA 2.0 und Bean Validation."

Ähnliche Präsentationen


Google-Anzeigen