You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: _posts/2011-10-12-spring-data-jpa.markdown
+26-29Lines changed: 26 additions & 29 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,21 +1,21 @@
1
1
---
2
2
layout: post
3
-
title: Spring-data-jpa
3
+
title: Spring Data JPA
4
4
author: jvillanti
5
5
tags: [resthub, spring-data, QueryDsl]
6
6
published: false
7
7
---
8
8
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.
10
10
11
11
## Présentation
12
12
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 !
15
15
16
16
## Cas d’utilisation basique
17
17
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.
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.
60
60
Pour les autres, plusieurs modes sont disponibles :
61
61
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)
63
63
* l’utilisateur écrit directement la requête (utilisation de @Query) avec la posibilité d'utiliser des paramètres nommés
64
64
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.
66
66
67
-
### 3)Configuration Spring
67
+
### 3)Configuration Spring
68
68
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 où se trouvent vos repositories qu'il doit gérer :
Maintenant on passe aux tests unitaires de notre "userRepository"
78
78
@@ -105,24 +105,21 @@ public class UserRepositoryTest {
105
105
}
106
106
{% endhighlight %}
107
107
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.
109
109
110
110
## 1er bilan :
111
111
112
112
* 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.
113
116
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, ...
122
119
123
120
## Cas d’utilisation avancé
124
121
125
-
### 1) Ajouter des comportements au repository
122
+
### 1) Ajouter des méthodes spécifiques au repository
126
123
127
124
{% highlight java %}
128
125
public interface UserRepositoryCustom {
@@ -150,7 +147,7 @@ public class UserRepositoryCustomImpl implements UserRepositoryCustom {
150
147
}
151
148
{% endhighlight %}
152
149
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.
154
151
155
152
{% highlight java %}
156
153
public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom{
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.
171
168
172
169
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).
173
170
@@ -192,7 +189,7 @@ Rien de particulier, on teste que notre UserRepository profite bien de la foncti
192
189
### 2) Utilisation de queryDsl
193
190
194
191
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.
196
193
197
194
#### 1ère étape : Génération des classes Q\*
198
195
@@ -218,7 +215,7 @@ Afin de pouvoir utiliser les classes QXXX (ici QUser) il faut les générer. Il
218
215
</plugin>
219
216
{% endhighlight %}
220
217
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".
222
219
223
220
#### 2ème étape : Utilisation de QueryDsl dans les repositories
224
221
@@ -260,7 +257,7 @@ public class UserRepositoryTest {
260
257
}
261
258
{% endhighlight %}
262
259
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.
264
261
265
262
#### 4ème étape : Enrichissement du modèle avec les prédicats
266
263
@@ -279,7 +276,7 @@ public class User {
279
276
private Integer age;
280
277
281
278
public static BooleanExpression isMinor() {
282
-
return QUser.user.age.lt(18);
279
+
return QUser.user.age.lt(18); // ??????? à déporter dans une spec ?
283
280
}
284
281
//GET et SET
285
282
}
@@ -312,6 +309,6 @@ On peut maintenant utiliser les prédicats prédéfinis pour générer des requ
312
309
313
310
## 2ème bilan :
314
311
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, ...).
0 commit comments