From spring-boot
Implements Spring Boot 4 DDD data layer with JPA/JDBC aggregates, Spring Data repositories, transactional services, projections, auditing, EntityGraph for N+1 prevention, and Boot 4 features like JSpecify and AOT.
npx claudepluginhub joaquimscosta/arkhe-claude-plugins --plugin spring-bootThis skill uses the workspace's default tool permissions.
Implements DDD tactical patterns with Spring Data JPA and Spring Data JDBC in Spring Boot 4.
Designs Spring Data JPA repositories, projections, query patterns, custom repos, CQRS read models, entity relationships, and persistence fixes for Java Spring Boot projects.
Guides Domain-Driven Design for complex business systems: defines bounded contexts, structures domain models, designs aggregates/entities/value objects, chooses monolith vs microservices.
Creates ddd4j (Domain-Driven Design for Java) projects using ddd4j-boot framework. Supports single-module monolith, multi-module monolith, and microservices architectures.
Share bugs, ideas, or general feedback.
Implements DDD tactical patterns with Spring Data JPA and Spring Data JDBC in Spring Boot 4.
| Choose | When |
|---|---|
| Spring Data JPA | Complex queries, existing Hibernate expertise, need lazy loading |
| Spring Data JDBC | DDD-first design, simpler mapping, aggregate-per-table, no lazy loading |
Spring Data JDBC enforces aggregate boundaries naturally—recommended for new DDD projects.
See WORKFLOW.md for detailed step-by-step instructions with code examples.
See EXAMPLES.md for complete working examples including:
@NullMarked and @Nullable annotationsjakarta.* namespaceList<T> instead of Iterable<T>New repository interface returning List<T> for better API ergonomics:
// OLD: CrudRepository returns Iterable<T>
public interface UserRepository extends CrudRepository<User, Long> {
Iterable<User> findAll(); // Requires conversion to List
}
// NEW: ListCrudRepository returns List<T>
public interface UserRepository extends ListCrudRepository<User, Long> {
List<User> findAll(); // Direct List return
List<User> findAllById(Iterable<Long> ids); // Also List
}
// Can also extend both for full functionality
public interface UserRepository extends
ListCrudRepository<User, Long>,
ListPagingAndSortingRepository<User, Long> {
}
Benefits: No more StreamSupport.stream(iterable.spliterator(), false).toList() conversions.
| Need | Skill |
|---|---|
| DDD concepts and design | domain-driven-design |
| REST API for aggregates | spring-boot-web-api |
| Module boundaries | spring-boot-modulith |
| Repository testing | spring-boot-testing |
| Anti-Pattern | Fix |
|---|---|
FetchType.EAGER on associations | Use LAZY + @EntityGraph when needed |
| Returning entities from controllers | Convert to DTOs in service layer |
@Transactional on private methods | Use public methods (proxy limitation) |
Missing readOnly = true on queries | Add for read operations (performance) |
| Direct aggregate-to-aggregate references | Reference by ID only |
| Multiple aggregates in one transaction | Use domain events for eventual consistency |
repository.save() before events dispatch@DataJpaTest — Use TestEntityManager for setup