This page shows how to lay the first stone: an entity, a Jakarta Data repository, a Mansart DataSource, and a transaction. Targets H2 in-memory for speed; switching to PostgreSQL only changes the configuration.
Prerequisites
-
Java 25 (Temurin) + Maven 3.9.16.
-
JDBC driver provided by the application (
com.h2database:h2ororg.postgresql:postgresql). -
cd mansart && sdk env(or equivalent.sdkmanrc) to pin the JVM and Maven.
Maven dependencies
<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>
The mansart-data-processor APT generates, at compile time, the metamodel (_Author) and the AuthorRepositoryImpl implementation. No runtime generation.
An entity
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 / no-arg constructor
}
Mansart also accepts its zero-dep annotation set io.vidocq.mansart.data.@Entity when you want to avoid jakarta.persistence-api at the business module’s compile time. See Reference.
A 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);
}
The APT generates shop.AuthorRepositoryImpl next to it, plus an entry in META-INF/mansart-repositories.list.
Standalone bootstrap
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);
CDI bootstrap (Vauban)
@Inject AuthorRepository authors;
@Transactional
public Author register(String name) {
return authors.save(new Author(name));
}
The mansart-data-cdi BCE reads META-INF/mansart-repositories.list and declares an @ApplicationScoped bean for each @Repository interface detected. The mansart-transactions interceptor materializes @Transactional. See Vauban for the CDI container details.