Cette page montre comment poser la première pierre : une entité, un repository Jakarta Data, un DataSource Mansart et une transaction. Cible H2 in-memory pour aller vite ; le passage à PostgreSQL ne change que la config.
Prérequis
-
Java 25 (Temurin) + Maven 3.9.16.
-
Driver JDBC fourni par l’application (
com.h2database:h2ouorg.postgresql:postgresql). -
cd mansart && sdk env(ou.sdkmanrcéquivalent) pour caler la JVM et Maven.
Dépendances Maven
<dependencies>
<dependency>
<groupId>io.vidocq.mansart</groupId>
<artifactId>mansart-data-api</artifactId>
<version>${mansart.version}</version>
</dependency>
<dependency>
<groupId>io.vidocq.mansart</groupId>
<artifactId>mansart-data-core</artifactId>
<version>${mansart.version}</version>
</dependency>
<dependency>
<groupId>io.vidocq.mansart</groupId>
<artifactId>mansart-data-dialect-h2</artifactId>
<version>${mansart.version}</version>
</dependency>
<dependency>
<groupId>io.vidocq.mansart</groupId>
<artifactId>mansart-pool</artifactId>
<version>${mansart.version}</version>
</dependency>
<dependency>
<groupId>io.vidocq.mansart</groupId>
<artifactId>mansart-transactions</artifactId>
<version>${mansart.version}</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>io.vidocq.mansart</groupId>
<artifactId>mansart-data-processor</artifactId>
<version>${mansart.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
L’APT mansart-data-processor génère, à compile, le métamodèle (_Author) et l’implémentation AuthorRepositoryImpl. Aucune génération à l’exécution.
Une entité
package shop;
import jakarta.persistence.*;
@Entity
@Table(name = "authors")
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String name;
// getters / setters / constructeur sans-arg
}
Mansart accepte aussi son set d’annotations zéro-dep io.vidocq.mansart.data.@Entity quand on veut éviter jakarta.persistence-api au compile-time du module métier. Voir Référence.
Un repository
package shop;
import jakarta.data.repository.BasicRepository;
import jakarta.data.repository.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface AuthorRepository extends BasicRepository<Author, Long> {
long count();
boolean existsById(Long id);
List<Author> findByName(String name);
Optional<Author> findOneByName(String name);
long deleteByName(String name);
}
L’APT génère shop.AuthorRepositoryImpl à côté, plus une entrée dans META-INF/mansart-repositories.list.
Bootstrap standalone
import io.vidocq.mansart.pool.MansartDataSource;
import io.vidocq.mansart.pool.PoolConfig;
import io.vidocq.mansart.data.MansartData;
var dataSource = MansartDataSource.create(PoolConfig.builder()
.jdbcUrl("jdbc:h2:mem:shop;DB_CLOSE_DELAY=-1")
.username("sa").password("")
.minSize(2).maxSize(10)
.build());
var authors = MansartData.repository(AuthorRepository.class, dataSource);
authors.save(new Author("Sylvie Germain"));
authors.findByName("Sylvie Germain").forEach(System.out::println);
Bootstrap CDI (Vauban)
@Inject AuthorRepository authors;
@Transactional
public Author register(String name) {
return authors.save(new Author(name));
}
La BCE mansart-data-cdi lit META-INF/mansart-repositories.list et déclare un bean @ApplicationScoped par interface @Repository détectée. L’intercepteur mansart-transactions matérialise @Transactional. Voir Vauban pour le détail du conteneur CDI.
Exemple complet dans Vidocq Runtime
L’exemple vidocq-runtime-mansart-h2-example (dans le repo Vidocq Runtime) montre le wiring de bout en bout : MansartDataSource + mansart-jakarta-data + @Transactional + endpoint REST Cassini. C’est le bac à sable de référence pour valider une intégration.
Étape suivante
-
Cas d’usage : pagination, JDQL, transactions imbriquées.
-
Concepts : Repository, EntityManager, Transaction, Pool.