Skip to content

Commit 87515d5

Browse files
committed
Collective review.
1 parent accfc97 commit 87515d5

File tree

1 file changed

+26
-29
lines changed

1 file changed

+26
-29
lines changed

_posts/2011-10-12-spring-data-jpa.markdown

Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
---
22
layout: post
3-
title: Spring-data-jpa
3+
title: Spring Data JPA
44
author: jvillanti
55
tags: [resthub, spring-data, QueryDsl]
66
published: false
77
---
88

9-
La préparation [de la version 2 de RESThub](http://pullrequest.org/2011/09/07/resthub-2-preview.html) et l’objectif de remplacer [Hades](http://redmine.synyx.org/) par [Spring-data](http://www.springsource.org/spring-data) nous a emmené à étudier le module spring-data-jpa et ses capacités.
9+
La préparation [de la version 2 de RESThub](http://pullrequest.org/2011/09/07/resthub-2-preview.html) et l’objectif de remplacer [Hades](http://redmine.synyx.org/) par [Spring-data](http://www.springsource.org/spring-data) nous a amené à étudier le module spring-data-jpa et ses capacités.
1010

1111
## Présentation
1212

13-
Le projet [Spring-data](http://www.springsource.org/spring-data) est un projet visant à simplifier l’utilisation des bases relationnelles et des bases NO SQL (Graph, Key-Value, Document).
14-
En plus des facilités de manipulation de données offertes par le project, Spring-data supporte le framework [QueryDsl](http://www.querydsl.com/) et ainsi la possibilité de donner [une orientation DDD](http://en.wikipedia.org/wiki/Domain-driven_design) introduit par *Eric Evans* à son travail. Sans rentrant dans les détails, on assiste peut être à la fin de nos modèles métiers anémiques !
13+
Le projet [Spring-data](http://www.springsource.org/spring-data) est un projet visant à simplifier l’utilisation des bases relationnelles et des bases NoSQL (Graph, Key-Value, Document).
14+
En plus des facilités de manipulation de données offertes par le projet, Spring Data supporte le framework [QueryDsl](http://www.querydsl.com/) et ainsi la possibilité de donner [une orientation DDD](http://en.wikipedia.org/wiki/Domain-driven_design). Sans rentrer dans les détails, on assiste peut être à la fin de nos modèles métiers anémiques !
1515

1616
## Cas d’utilisation basique
1717

18-
Maintenant on rentre dans le vif du sujet avec un projet exemple montrant les possibilités offertes par Spring-data-jpa.
18+
Maintenant on rentre dans le vif du sujet avec un projet exemple montrant les possibilités offertes par Spring Data JPA.
1919

2020
### 1) Objet domain
2121

@@ -56,23 +56,23 @@ public interface UserRepository extends JpaRepository<User, Long> {
5656
}
5757
{% endhighlight %}
5858

59-
Le travail au niveau du repository se limite à l'écriture de l'interface et c'est Spring-data-jpa qui se charge de faire l'implémentation. Les habitués du framework [Hades](http://redmine.synyx.org/) reconnaitrons sans mal ce mode de fonctionnement.
59+
Le travail au niveau du repository se limite à l'écriture de l'interface et c'est Spring-data-jpa qui se charge de faire l'implémentation. Les habitués du framework [Hades](http://redmine.synyx.org/) reconnaitront sans mal ce mode de fonctionnement.
6060
Pour les autres, plusieurs modes sont disponibles :
6161

62-
* le framework compose automatiquement les requêtes en se basant sur des mots clés (ByXXX, Order, …) (ex : findByUsernameAndAge, ...) [liste de mots clés](http://static.springsource.org/spring-data/data-jpa/docs/1.0.0.RC1/reference/html/#repositories.query-methods.property-expressions)
62+
* le framework compose automatiquement les requêtes en se basant sur des mots clés (byXXX, Order, …) (ex : findByUsernameAndAge, ...) [liste de mots clés](http://static.springsource.org/spring-data/data-jpa/docs/1.0.0.RC1/reference/html/#repositories.query-methods.property-expressions)
6363
* l’utilisateur écrit directement la requête (utilisation de @Query) avec la posibilité d'utiliser des paramètres nommés
6464

65-
A savoir, qu’il est possible de gérer les Pages pour les requêtes qui peuvent ramener beaucoup de résultats.
65+
A savoir, qu’il est possible de gérer la pagination pour les requêtes qui peuvent ramener beaucoup de résultats.
6666

67-
### 3)Configuration Spring
67+
### 3) Configuration Spring
6868

69-
Il faut juste indiquer à Spring-data-jpa le package ou se trouve vos repositories qu'il doit gérer :
69+
Il faut juste indiquer à Spring-data-jpa le package se trouvent vos repositories qu'il doit gérer :
7070

7171
{% highlight xml %}
7272
<jpa:repositories base-package="fr.test.repository" />
7373
{% endhighlight %}
7474

75-
### 4)Tests
75+
### 4) Tests
7676

7777
Maintenant on passe aux tests unitaires de notre "userRepository"
7878

@@ -105,24 +105,21 @@ public class UserRepositoryTest {
105105
}
106106
{% endhighlight %}
107107

108-
Rien de spécial, on injecte notre repository et on peut ensuite tester toutes les fonctions.
108+
Rien de spécial, on injecte notre repository et on peut ensuite tester toutes les méthodes.
109109

110110
## 1er bilan :
111111

112112
* Avantages :
113+
* pour ceux qui connaissent Hades, on est très proche du mode de fonctionnement;
114+
* les fonctions CRUD déjà implémentées;
115+
* le mode implémentation automatique permet de gagner du temps dans les petits développements.
113116

114-
* pour ceux qui connaissent Hades, on est très proche du mode de fonctionnement;
115-
* les fonctions CRUD déjà implémentées;
116-
* le mode implémentation automatique permet de gagner du temps dans les petits développements.
117-
118-
* Limitations :
119-
120-
* les interfaces peuvent vite devenir confuses avec des FindByXXXandYYY, FindByXXXandYYYOrderBy, ...
121-
* les requêtes persos ne sont pas vérifiées avant l’exécution (aie aux tests unitaires oubliés)
117+
* Inconvénients :
118+
* les interfaces peuvent vite devenir confuses avec des FindByXXXandYYY, FindByXXXAndYYYOrderBy, ...
122119

123120
## Cas d’utilisation avancé
124121

125-
### 1) Ajouter des comportements au repository
122+
### 1) Ajouter des méthodes spécifiques au repository
126123

127124
{% highlight java %}
128125
public interface UserRepositoryCustom {
@@ -150,7 +147,7 @@ public class UserRepositoryCustomImpl implements UserRepositoryCustom {
150147
}
151148
{% endhighlight %}
152149

153-
Que du classique : A savoir la déclaration et l'implémentation des comportements que l'on souhaite ajouter à notre repository. Il s'agit d'un bean classique que l'on pourrait injecter dans une classe indépendamment de notre repository.
150+
Que du classique : A savoir la déclaration et l'implémentation des méthodes que l'on souhaite ajouter à notre repository. Il s'agit d'un bean classique que l'on pourrait injecter dans une classe indépendamment de notre repository.
154151

155152
{% highlight java %}
156153
public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom{
@@ -167,7 +164,7 @@ public interface UserRepository extends JpaRepository<User, Long>, UserRepositor
167164
}
168165
{% endhighlight %}
169166

170-
On rajoute à notre repository "UserRepository" un extends sur notre repository UserRepositoryCustom et hop on profite des fonctionnalités de spring-data-jpa plus celles de notre implémentation de UserRepositoryCustom
167+
On rajoute à notre repository "UserRepository" un extends sur notre repository UserRepositoryCustom et hop on profite des fonctionnalités de spring-data-jpa en plus celles de notre implémentation spécifique.
171168

172169
A savoir qu'il est possible d'ajouter des comportements "par défaut" à tous les repositories. [(cf la doc de spring-data)]( http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories).
173170

@@ -192,7 +189,7 @@ Rien de particulier, on teste que notre UserRepository profite bien de la foncti
192189
### 2) Utilisation de queryDsl
193190

194191
QueryDsl est un framework qui permet d'écrire des requêtes type-safe dans un langage humainement compréhensible.
195-
Grâce à QueryDsl on va pouvoir supprimer une des limites énoncée dans le 1er bilan et éviter pas mal de surprise à l'éxécution. On va même discrètement rajouter un peu de métier dans autre objet domain.
192+
Grâce à QueryDsl on va pouvoir supprimer une des limites énoncées dans le 1er bilan et éviter pas mal de surprises à l'exécution. On va même discrètement rajouter un peu de métier dans autre objet domain.
196193

197194
#### 1ère étape : Génération des classes Q\*
198195

@@ -218,7 +215,7 @@ Afin de pouvoir utiliser les classes QXXX (ici QUser) il faut les générer. Il
218215
</plugin>
219216
{% endhighlight %}
220217

221-
Rem : Pour les personnes sous Eclipse il faut penser à faire un "update project configuaration".
218+
Rem : Pour les utilisateurs d'Eclipse il faut penser à faire un "update project configuaration".
222219

223220
#### 2ème étape : Utilisation de QueryDsl dans les repositories
224221

@@ -260,7 +257,7 @@ public class UserRepositoryTest {
260257
}
261258
{% endhighlight %}
262259

263-
Et hop, on peut profiter de tout un langage pour générer ses requêtes type-safe! [voir la document QueryDsl]( http://source.mysema.com/static/querydsl/2.2.0/reference/html). La complétion rajoute vraiment un confort non négligeable.
260+
Et hop, on peut profiter de tout un langage (DSL) pour générer ses requêtes type-safe! [voir la document QueryDsl]( http://source.mysema.com/static/querydsl/2.2.0/reference/html). La complétion rajoute vraiment un confort non négligeable.
264261

265262
#### 4ème étape : Enrichissement du modèle avec les prédicats
266263

@@ -279,7 +276,7 @@ public class User {
279276
private Integer age;
280277

281278
public static BooleanExpression isMinor() {
282-
return QUser.user.age.lt(18);
279+
return QUser.user.age.lt(18); // ??????? à déporter dans une spec ?
283280
}
284281
//GET et SET
285282
}
@@ -312,6 +309,6 @@ On peut maintenant utiliser les prédicats prédéfinis pour générer des requ
312309

313310
## 2ème bilan :
314311

315-
* On retrouve biens les concepts d'Hades et la possibilité d'étendre les repositories afin de rajouter des comportements.
316-
* L'utilisation du QueryDsl est vraiment intéressante. On peut fabriquer des requêtes type-safe et dans un langue proche de langage courant et on profite de la complétion!. On évite aussi de rajouter toutes les 5secondes une nouvelle méthode dans le repostitory (cela évite d'avoir plusieurs dizaines findByXXXandYYY, ...).
312+
* On retrouve bien les concepts d'Hades et la possibilité d'étendre les repositories afin de rajouter des méthodes spécifiques.
313+
* L'utilisation du QueryDsl est vraiment intéressante. On peut fabriquer des requêtes type-safe et dans un langue proche du langage courant et on profite de la complétion ! On évite aussi de rajouter toutes les 5 secondes une nouvelle méthode dans le repostitory (cela évite d'avoir plusieurs dizaines findByXXXandYYY, ...).
317314

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy