Formation Java / Spring Boot – Passage à la persistance réelle
À l’issue de cette journée, vous sevez capable de :
JpaRepository
H2
Aujourd’hui, votre projet devient une vraie application persistante !
Jusqu’à présent on utilisait souvent des tableaux, des ArrayList, des HashMap.
private final Map<String, Compte> stockage = new HashMap<>();
Limites :
Nous allons connecter le projet à une base PostgreSQL
JPA est une spécification Java permettant :
JPA n’est pas un outil concret. Hibernate est l’implémentation la plus utilisée.
Spring Boot intègre Hibernate automatiquement.
ORM = Object Relational Mapping
Correspondance :
Dans application.properties :
application.properties
spring.datasource.url=jdbc:h2:mem:banklite spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password= spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.h2.console.enabled=true spring.jpa.hibernate.ddl-auto=update
Avec l’option ddl-auto=update cela permet de :
ddl-auto=update
Console H2 :
http://localhost:8080/h2-console
Compte
@Entity @Inheritance(strategy = InheritanceType.JOINED) public abstract class Compte { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String numero; private BigDecimal solde; // constructeurs // getters }
Pour l’apprentissage : utilisez JOINED.
JOINED
@Entity public class CompteCourant extends Compte { private BigDecimal decouvertAutorise; }
@Entity public class CompteEpargne extends Compte { }
public interface CompteRepository extends JpaRepository<Compte, Long> { Optional<Compte> findByNumero(String numero); }
Aucun code à écrire Méthodes CRUD générées automatiquement
Méthodes disponibles :
@Service public class CompteService { private final CompteRepository repository; public CompteService(CompteRepository repository) { this.repository = repository; } public List<Compte> listerComptes() { return repository.findAll(); } public Compte creerCompte(Compte compte) { return repository.save(compte); } public Compte trouverParNumero(String numero) { return repository.findByNumero(numero) .orElseThrow(() -> new IllegalArgumentException("Compte introuvable")); } }
POST :
POST /api/comptes
GET :
GET /api/comptes
Les données persistent désormais en base H2.
Optional<Compte>
Évite :
if (compte == null)
Bonne pratique :
repository.findByNumero(numero) .orElseThrow(...)
Exemple :
List<Compte> findBySoldeGreaterThan(BigDecimal montant);
Spring génère automatiquement la requête SQL.
Ajouter :
@Transactional
Sur une méthode service :
@Transactional public void virer(...) { }
Garantit :
Consignes :
CompteRepository
findBySoldeGreaterThan
@Entity
@Id
BankLite est maintenant :
Vous savez désormais :
Projet avec un backend professionnel.
On abordera :
On entre dans le niveau avancé.
```