Lexique technique de Mansart. Pose les définitions communes aux quatre sous-modules pour éviter l’ambiguïté quand on lit internals.adoc ou reference.adoc.
Entity
Classe Java annotée @jakarta.persistence.Entity (ou son équivalent Mansart @io.vidocq.mansart.data.Entity zéro-dep). Elle représente une ligne d’une table SQL. Mansart lit ses annotations à la compilation via APT et génère un métamodèle statique (Book ou Book), pas de scan classpath au démarrage.
Attributs reconnus : @Id, @GeneratedValue, @Column, @Table, @Version, @Enumerated, @Embedded/@Embeddable, @ManyToOne, @OneToOne, @JoinColumn, @Transient. Les collections (@OneToMany, @ManyToMany) et l’héritage sont reportés à mansart-persistence (M7).
Repository
Interface annotée @jakarta.data.repository.Repository. Spécifie ce que l’application veut faire de l’entité, sans préjuger du SQL exact. Mansart matérialise l’interface en classe XxxRepositoryImpl à la compilation (APT). Aucune réflexion à l’exécution, aucun proxy dynamique.
Trois racines standards :
-
BasicRepository<T, K>— CRUD minimal (save,delete,findById,findAll,count,existsById). -
CrudRepository<T, K>— étendBasicRepositoryavec variantes batch. -
DataRepository<T, K>— repository « libre » à composer entièrement par méthodes nommées et@Query.
EntityManager
Concept Jakarta Persistence 3.2 — gestionnaire de cycle de vie des entités (managed/detached), file de modifications, propagation flush/commit. Hors périmètre de mansart-jakarta-data ; sera fourni par mansart-persistence (M7 en attente — voir mansart-persistence).
Dans Vidocq, le besoin courant (CRUD + queries typées) est déjà couvert par les repositories Jakarta Data, qui contournent l'`EntityManager` au profit d’un mapping ResultSet direct via MethodHandle.
Transaction
Démarcation atomique d’un ensemble d’opérations sur une ou plusieurs ressources. Mansart implémente Jakarta Transactions 2.0 :
-
TransactionManager — API SPI, gérée par le conteneur.
begin/commit/rollback,suspend/resume,enlistResource/delistResource. -
UserTransaction — API utilisateur, programmatique.
-
@Transactional— intercepteur CDI déclaratif, supporte les six TxType standards. -
TransactionScoped — scope CDI dont la durée de vie épouse la transaction.
Le contexte transactionnel est porté par un ScopedValue<TransactionContext> — propagation transparente à travers les virtual threads créés via StructuredTaskScope.
ConnectionPool
Cache borné de java.sql.Connection physiques. Évite le coût connect/disconnect à chaque requête. mansart-pool fournit MansartDataSource implements javax.sql.DataSource :
-
Deque<PooledConnection> idle— pile lock-free des connexions disponibles. -
Set<PooledConnection> inUse— empruntées en cours. -
Semaphore permits— taille =maxSize, bloque l’acquisition au-delà. -
ScopedValue<Connection> CURRENT— connexion liée à la transaction courante. -
Housekeeper virtual thread — eviction
idleTimeout/maxLifetime, validationisValid.
Dialecte SQL
MansartDialect — SPI qui isole les différences SQL entre bases : pagination (LIMIT/OFFSET vs FETCH FIRST), upsert (ON CONFLICT vs MERGE), retour d’identifiant (RETURNING vs getGeneratedKeys), types (UUID, JSONB, BOOLEAN).
Découverte par ServiceLoader (provides DialectFactory with H2DialectFactory). Dialectes livrés : H2, PostgreSQL. D’autres au backlog (MariaDB, SQL Server).
Métamodèle statique
Classes générées par APT à côté des entités. Deux formats :
-
Format Mansart riche (
_Book) —_Book.titleest uneTextAttribute<Book>aveccolumnName(),MethodHandle getter(), etc. Permet au dialecte de générer du SQL spécialisé sansinstanceofen chaîne. -
Format JPA standard (
Book_) —Book_.titleest uneSingularAttribute<Book, String>. Interop pour Criteria API future.
Les MethodHandle sont obtenus une seule fois au <clinit> via MethodHandles.privateLookupIn(…) — jamais de réflexion à l’usage.
JDQL vs JPQL
-
JDQL (Jakarta Data Query Language) — sous-ensemble simplifié défini par Jakarta Data 1.0. SELECT/UPDATE/DELETE sur entités,
LIKE,BETWEEN,ORDER BY, paramètres nommés. Mansart le supporte via@Querydansmansart-jakarta-data. -
JPQL (Jakarta Persistence Query Language) — surensemble plus riche (joins explicites, sous-requêtes, agrégats), traité par
mansart-persistence(M7). Pour l’instant, les besoins JPQL sont couverts par JDQL ou par requête SQL native.
Différences Jakarta Data vs JPA
| Aspect | Jakarta Data 1.0 (mansart-jakarta-data) |
Jakarta Persistence 3.2 (mansart-persistence) |
|---|---|---|
API |
Repositories déclaratifs typés |
|
Cycle de vie entités |
Stateless — pas de managed/detached |
Persistence context (managed) |
Cache L1 |
Aucun |
Persistence context |
Requêtes |
Method names + JDQL + lifecycle annotations |
JPQL + Criteria API |
État Mansart |
✅ Livré (TCK 73/73) |
⏳ M7 en attente |