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

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

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

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

Advanced Topics

Persistente Domänenmodelle mit JPA 2.0 und Bean Validation

Page 2: 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:

@NamedNativeQuery( name = "employeeReporting", query = "SELECT * FROM emp WHERE id = ?", resultClass = Employee.class)

Query q = em.createNamedQuery("employeeReporting");q.setParameter(1, employeeId);q.getResultList()

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

3

Result Set Mapping (1)

Definition

Verwendung

@SqlResultSetMapping(name = "employeeResult",entities = @EntityResult(entityClass = Employee.class)

Query q = em.createNativeQuery( "SELECT * FROM EMPLOYEE", "employeeResult");

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

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@SqlResultSetMapping(name = "EmployeeWithAddress",entities = {@EntityResult(entityClass = Employee.class), @EntityResult(entityClass = Address.class)}

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

5

Result Set Mapping (3)

Mapping InheritanceSELECT id, name, start_date, daily_rate, term, vacation, hourly_rate, salary, pension, type FROM employee_stage

@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") } ) )

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

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

@Entitypublic class ImageMessage extends Message { @PrePersist @PreUpdate protected void compress(){ ... } @PostLoad @PostUpdate protected void uncompress() { ... }

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

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:

public class BaseEntityDebugListener { @PrePersist public void debugPrePersist(BaseEntity e) { log.debug("PrePresist: " + e); }}

@Entity@EntityListeners({BaseEntityDebugListener.class})public class Employee extends BaseEntity

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

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

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

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.

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

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@Entity public class Employee { @Version protected long version; ...

create table emp ( version bigint not null, ...

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

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

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

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

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

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); }}

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

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öglichenpublic class Message { @Column (unique = false, nullable=false, columnDefinition="varchar", lenghth=64 ) public BigDecimal sender;

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

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)

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

16

XML Mapping

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

17

The Metadata Puzzle

Reihenfolge bei der Verarbeitung der Metadaten:1. Annotations verarbeiten2. Klassen aus XML Mapping hinzufügen3. Attribute aus XML Mapping hinzufügen4. Defaultwerte setzen

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

18

Das Mapping File

Rootelement is entity-mappings:

<?xml version="1.0" encoding="UTF-8"?><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">

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

19

Defaults im Mapping File

Annotations ausschalten <xml-mapping-metadata-complete />

Persistence Unit Defaults schema catalog access cascade-persist entity-listeners

Diese können auch ausgeschaltet werden exclude-default-listeners @ExcludeDefaultListeners

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

20

Defaults im Mapping File

Mapping File Defaults package schema catalog access

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

21

Queries und Generators

sequence-generator

table-generator

named-query

named-native-query

sql-result-set-mapping

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

22

Entity Mapping mit XML

<entity class="examples.model.Employee"><attributes> <id name="id"> <generated-value strategy="SEQUENCE" /> </id> <many-to-one name="department" /> <many-to-one name="manager" /> <one-to-many name="phones" mapped-by="employee" /> <one-to-many name="directs" mapped-by="manager" /> <one-to-one name="address" /> <many-to-many name="projects" mapped-by="employees" /></attributes></entity>

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

23

Packaging and Deployment

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

24

Configuring Persistence Units

Persistence Unit Name<persistence-unit name="EmployeeService" />

Transaction TypeRESOURCE_LOCAL oder JTA

Persistence Provider<provider>org.hibernate.ejb.HibernatePersistence</provider>

Data Source nur bei JTA

Mapping Files<mapping-file>META-INF/queries.xml</mapping-file>

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

25

Managed Classes

Lokale Klassen Alle annotierten Klassen im Deployment Unit in welcher das persistence.xml gepackt ist

Klassen in Mapping FilesMit XML gemappte Klassen

Explicitly Listed ClassesIm persistence.xml eingetragene Klassen

Zusätzliche JARs mit Managed ClassesIm persistence.xml unter jar-file eingetragene JARs

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

26

Properites zur Laufzeit übergeben

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

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

27

Tools

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

28

IDE Integration

Eclipse Projekt DALI Oracle Enterprise Pack for Eclipse JBoss Tools

NetBeans IntelliJ IDEA