generic daos with hades -...
TRANSCRIPT
![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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/1.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/3.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/5.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/6.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/7.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/8.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/9.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/15.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/16.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/19.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/21.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/24.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/25.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/26.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/27.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/28.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/29.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/30.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/31.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/32.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/33.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/34.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/35.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/36.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/37.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/38.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042208/5eab4f67e674611223101bac/html5/thumbnails/39.jpg)
11 .01.08
Backups
39
Apache 2.0 licence
Hades project home
Don‘t repeat the DAO
Spring & DAO - Eberhard Wolff, JavaMagazin 11/2007