Mappingregels
We onderscheiden onderstaande gevallen van mappings/references die je definieert in Spring Data JDBC in:
- sql in
schema.sql - en in Java-code (
model/folder typisch)
In Java gebruik je basic attributes, en soms dus constructie AggregateReference<...> gebruikt voor verwijzingen tussen aggregates. Hieronder een samenvatting, maar het is handiger om de details te bekijken in de volgende paragrafen. En de video van Dan Vega uit de voorbereiding, of de Spring Boot JDBC documentatie waarop dit is gebaseerd (Spring Boot, 2025).
Inhoudsopgave
TL; DR/Samenvatting
High level zijn er 2*3=6 opties, waarvan er 1 niet mag en 1 niet kan.
Twee opties 'intern of extern':
- een reference binnen een aggregate ('within aggregate')
- of vanuit de ene aggregate naar een andere ('between aggregates')
Keer drie opties 'hoe de pijl loopt':
- A. vanuit de aggregate root naar andere entity/value object (mag niet 'between aggregates', want je mag alleen via aggregate root gaan)
- B. of vanuit een andere entity/value object naar de aggregate root
- C. of vanuit de ene aggregate root naar een andere aggregate root (kan niet 'within aggregate', want een aggregate heeft maar 1 root)
1A. Aggregate root naar ander object binnen aggregate
create table Comment(
...
post int not null,
foreign key (post) references Post(id)
...
);
public class Post {
...
private final Set<Comment> comments = new HashSet<>();
...
}
1B. Object binnen aggregate naar aggregate root
Deze relatie wordt NIET opgeslagen in de database. Je kunt deze relatie opnemen in de Java-code, maar dan moet je de referentie handmatig setten nadat je de aggregate uit de database hebt gehaald.
public class Comment {
...
@Transient
private Post post;
...
}
1C. Aggregate root naar aggregate root binnen aggregate
Deze relatie mag NIET bestaan, want een aggregate heeft per definitie maar één aggregate root.
2A. Object naar ander object van andere aggregate
Deze relatie mag NIET bestaan, want objecten buiten een aggregate mogen alleen naar de aggregate root verwijzen.
2B. Object naar aggregate root van andere aggregate
create table Comment(
...
author int,
foreign key (author) references Author(id)
...
);
public class Comment {
...
private AggregateReference<Author, Integer> author;
...
}
2C. Aggregate root naar aggregate root van andere aggregate
create table Post (
...
author int,
foreign key (author) references Author(id)
...
);
public class Post {
...
private AggregateReference<Author, Integer> author;
...
}