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
+17-7Lines changed: 17 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,6 +3,7 @@ layout: post
3
3
title: Spring-data-jpa
4
4
author: jvillanti
5
5
tags: [resthub, spring-data, QueryDsl]
6
+
published: false
6
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.
@@ -13,9 +14,11 @@ Le projet [Spring-data](http://www.springsource.org/spring-data) est un projet v
13
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 !
14
15
15
16
## Cas d’utilisation basique
17
+
16
18
Maintenant on rentre dans le vif du sujet avec un projet exemple montrant les possibilités offertes par Spring-data-jpa.
17
19
18
20
### 1)Objet domain
21
+
19
22
@Entity
20
23
public class User {
21
24
@Id
@@ -26,23 +29,24 @@ Maintenant on rentre dans le vif du sujet avec un projet exemple montrant les po
26
29
private String username;
27
30
28
31
@Column(nullable = false)
29
-
private Integer age;
32
+
private Integer age;
30
33
31
34
//Get et Set
32
35
}
33
36
34
37
Ici, Pojo classique pour ne pas dire "anémique". Aucune référence à spring-data n'est nécessaire.
35
38
36
39
### 2)Repository
40
+
37
41
public interface UserRepository extends JpaRepository<User, Long> {
Maintenant on passe aux tests unitaires de notre "userRepository"
65
71
public class UserRepositoryTest {
66
72
@Autowired
@@ -105,6 +111,7 @@ Rien de spécial, on injecte notre repository et on peut ensuite tester toutes l
105
111
* les requêtes persos ne sont pas vérifiées avant l’exécution (aie aux tests unitaires oubliés)
106
112
107
113
## Cas d’utilisation avancé
114
+
108
115
### 1)Ajouter des comportements au repository
109
116
110
117
public interface UserRepositoryCustom {
@@ -163,13 +170,15 @@ A savoir qu'il est possible d'ajouter des comportements "par défaut" à tous le
163
170
}
164
171
//.....
165
172
}
173
+
166
174
Rien de particulier, on teste que notre UserRepository profite bien de la fonction définie dans notre UserRepositoryCustom.
167
175
168
176
### 2)Utilisation de queryDsl
177
+
169
178
QueryDsl est un framework qui permet d'écrire des requêtes type-safe dans un langage humainement compréhensible.
170
179
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.
171
-
172
-
#### 1er étape : Génération des classes Q*
180
+
181
+
#### 1er étape : Génération des classes Q\*
173
182
174
183
Afin de pouvoir utiliser les classes QXXX (ici QUser) il faut les générer. Il existe un plugin Maven dédié à ce travail.
175
184
@@ -275,5 +284,6 @@ Ici, on voit le côté DDD et l'ajout de métier dans le modèle.
275
284
On peut maintenant utiliser les prédicats prédéfinis pour générer des requêtes.
276
285
277
286
## 2ème bilan :
287
+
278
288
* On retrouve biens les concepts d'Hades et la possibilité d'étendre les repositories afin de rajouter des comportements.
279
289
* 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, ...).
0 commit comments