Generic DAOs with Hades -...

39
Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things should be simple, complex things should be possible.“ Alan Kay

Transcript of Generic DAOs with Hades -...

Page 1: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

Generic DAOs with HadesOliver Gierke - Synyx GmbH & Co. KG

„Simple things should be simple, complex things should be possible.“Alan Kay

Page 2: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Agenda

Database access with JPA / Spring

GenericDao

Finder methods

Spring namespace configuration

Base classes for domain objects

Auditing

2

Page 3: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

How to implement data accesswith JPA / Spring?

State of the art ORM

Page 4: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Database access with JPA / Spring

4

public class EntityDao {

@PersistenceContextprivate EntityManager em;

@PersistenceUnitprivate EntityManagerFactory emf;

public void bar() {

MyEntity x = em.find(1, MyEntity.class);}

}

Page 5: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Code Samples

5

Page 6: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Database access with JPA / Spring

Issues

Generalize?

Paging? / Sorting?

Query by example?

Executing finder methods?

Auditing?

6

Page 7: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

GenericDaoImplementing DRY and KISS

Page 8: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

CRUD Methods

8

interface GenericDao <T extends Persistable<PK>, PK> {

void save(T entity);

void delete(T entity);

T readByPrimaryKey(PK primaryKey);

Page<T> readAll(Pageable pageable, Sort s);

...}

Page 9: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

GenericDao

Based on plain JPA

No criteria API (readByExample)

Every vendor supported

Usage

Declare interface for strong typing

Create instance with GenericDaoFactoryBean AOP Proxy

9

Page 10: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Code Samples

10

Page 11: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

GenericDao

Issues

Generalize?

Paging? / Sorting?

Query by example?

Executing finder methods?

Auditing?

11

Page 12: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

GenericDao

Issues

✓Generalize

✓ Paging / Sorting

Query by example?

Executing finder methods?

Auditing?

12

Page 13: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Extended Generic Dao

// Generics omitted ;)

ExtendedGenericDao extends GenericDao {

List<T> readByExample(T... examples);...

}

13

Page 14: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Extended Generic Dao

14

Uses vendor specific API (e.g. Hibernate)

Provides features not available with plain JPA

readByExample

Usage

DAO interface has to extend ExtendedGenericDao

use provider specific Generic${provider}JpaDao

Page 15: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Code Samples

15

Page 16: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

ExtendedGenericDao

Issues

✓Generalize

✓ Paging / Sorting

Query by example?

Executing finder methods?

Auditing?

16

Page 17: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

ExtendedGenericDao

Issues

✓Generalize

✓ Paging / Sorting

✓Query by example

Executing finder methods?

Auditing?

17

Page 18: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

Finder methods

Page 19: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Finder methods

Methods to find entities based on certain criterias

UserDao -> findByLastname(String lastname)

Usage

Declare typed interface with finder methods

Use GenericDaoFactoryBean to create instance

19

Page 20: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Finder methods

How to get from the method to the query?

@NamedQuery

Extract query from method name

Configurable strategy

default: CREATE_IF_NOT_FOUND

20

Page 21: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Finder methods

UserDao extends GenericDao<User, Long> {

List<User> findByUsername(String username);}

21

Page 22: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Finder methods

UserDao extends GenericDao<User, Long> {

List<User> findByUsername(String username);}

from User u where u.username = ?

22

Page 23: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Finder methods

UserDao extends GenericDao<User, Long> {

List<User> findByUsername(String username);}

from User u where u.username = ?

@NamedQuery(name=“User.findByUsername“,query=“from User u where u.username = ?“)

23

Page 24: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

GenericDaoFactoryBean

Issues

✓Generalize

✓ Paging / Sorting

✓Query by example

Executing finder methods?

Auditing?

24

Page 25: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

GenericDaoFactoryBean

Issues

✓Generalize

✓ Paging / Sorting

✓Query by example

✓ Executing finder methods

Auditing?

25

Page 26: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

Spring namespace configurationLet XML speak and hide complexity

Page 27: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Spring namespace configuration

<hades:dao-config entity-package-name=“com.acme.domain“dao-package-name=“com.acme.dao“ />

27

Page 28: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Spring namespace configuration

<hades:dao-config entity-package-name=“com.acme.domain“dao-package-name=“com.acme.dao“ />

// Defaultsdao-base-class = GenericJpaDao

dao-name-postfix = “Dao“ (for bean name)dao-impl-postfix = „DaoImpl“ (custom impls)

finder-lookup-strategy = „create-if-not-found“finderPrefix = „findBy“

28

Page 29: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Spring namespace configuration

29

Registers GenericDaoFactoryBeans

Registers necessary *PostProcessors

Auto configuration possible by classpath scanning

Convention over configuration

Page 30: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

Domain objects„Place the project's primary focus on the domain “

Eric Evans - Domain Driven Design

Page 31: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Domain objects

31

Only dependency - Persistable<PK>

Usually common base class for domain classes

AbstractPersistable<PK>

defines id property as well as isNew()

AbstractAuditable<U>

see next slides

Page 32: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Auditing

32

Page 33: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Auditing

Keeping track of who changed what when

Usage

Implement at least AbstractAuditable<U>

Enable AuditingAdvice

Provide auditor by implementing AuditorAware

optional

33

Page 34: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Auditing

34

interface Auditable extends Persistable {

// Getters omitted

setCreatedBy(T who);setCreatedDate(Date date);

setLastModifiedBy(T who);setLastModifiedDate(Date date);

}

Page 35: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

AuditingAdvice

35

@Aspectpublic class AuditingAdvice {

@Before(„execution(* GenericDao+.save*(..))&& args(auditable)“)

public void touch(Auditable auditable) {...

}}

Page 36: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

Meta stuffGive me the high level picture!

Page 37: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Overview

Implementation of CRUD Operations

Executing finder methods

@NamedQuery

Dynamic query creation

Base classes for domain objects

Auditing

Setting creation and modification date and user

Configuration via Spring namespace

37

Page 38: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

Q & AThanks for your attention!

Page 39: Generic DAOs with Hades - jug-karlsruhe.dejug-karlsruhe.de/assets/slides/Generic_DAOs_with_Hades.pdf · Generic DAOs with Hades Oliver Gierke - Synyx GmbH & Co. KG „Simple things

11 .01.08

Backups

39

Apache 2.0 licence

Hades project home

Don‘t repeat the DAO

Spring & DAO - Eberhard Wolff, JavaMagazin 11/2007