Ga naar hoofdinhoud

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':

  1. een reference binnen een aggregate ('within aggregate')
  2. 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

ce359fc28a5b6106b23022de96318477

PlantUML broncode voor "post-comment"
@startuml
!define han_red e50056

hide circle

rectangle "Post Aggregate" {

class Post <<Aggregate Root>> {
addComment(comment)
addComments(comments)
}

class Comment <<Entity>> {
}
}

rectangle "Author Aggregate" {

class Author <<Aggregate Root>> {
}

class Reputation <<Value Object>> {

}
}
Post -[#han_red,thickness=3]-> "comments *" Comment #text:han_red;
Post "*" -r-> "author \n 1" Author: \t\t
Author "1" -d-> "reputation 1" Reputation

@enduml

Klassendiagram met 4 klasse(n) en 2 relatie(s).

Klassen:

  • Klasse Post met stereotype Aggregate Root met:
    • publieke methode 'addComment', met parameter(s) 'comment', return type void
    • publieke methode 'addComments', met parameter(s) 'comments', return type void
    • geen attributen
  • Klasse Comment met stereotype Entity zonder methoden en attributen
  • Klasse Author met stereotype Aggregate Root zonder methoden en attributen
  • Klasse Reputation met stereotype Value Object zonder methoden en attributen

Relaties:

  • Post heeft een associatie-relatie met naam '\t\t' met Author, multipliciteit * naar 1
  • Author heeft een associatie-relatie met naam 'reputation 1' met Reputation
SQL
create table Comment( 
...
post int not null,
foreign key (post) references Post(id)
...
);
Java
public class Post {
...
private final Set<Comment> comments = new HashSet<>();
...
}

1B. Object binnen aggregate naar aggregate root

60206fc3df41facd4779f37e95bd6830

PlantUML broncode voor "comment-post"
@startuml
!define han_red e50056

hide circle

rectangle "Post Aggregate" {

class Post <<Aggregate Root>> {
addComment(comment)
addComments(comments)
}

class Comment <<Entity>>{
}
}

rectangle "Author Aggregate" {

class Author <<Aggregate Root>> {
}

class Reputation <<Value Object>> {

}
}
Post "post 1" <-[#han_red,thickness=3]- Comment #text:han_red;
Post "*" -r-> "author \n 1" Author: \t\t
Author "1" -d-> "reputation 1" Reputation


@enduml

Klassendiagram met 4 klasse(n) en 2 relatie(s).

Klassen:

  • Klasse Post met stereotype Aggregate Root met:
    • publieke methode 'addComment', met parameter(s) 'comment', return type void
    • publieke methode 'addComments', met parameter(s) 'comments', return type void
    • geen attributen
  • Klasse Comment met stereotype Entity zonder methoden en attributen
  • Klasse Author met stereotype Aggregate Root zonder methoden en attributen
  • Klasse Reputation met stereotype Value Object zonder methoden en attributen

Relaties:

  • Post heeft een associatie-relatie met naam '\t\t' met Author, multipliciteit * naar 1
  • Author heeft een associatie-relatie met naam 'reputation 1' met Reputation

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.

Java
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

b6f6173f136ba60b657a60b3432655e2

PlantUML broncode voor "comment-reputation"
@startuml
!define han_red e50056

hide circle

left to right direction

rectangle "Post Aggregate" {

class Post <<Aggregate Root>> {
addComment(comment)
addComments(comments)
}

class Comment <<Entity>> {
}
}

rectangle "Author Aggregate" {

class Author <<Aggregate Root>> {
}

class Reputation <<Value Object>> {

}
}

Post "*" -> "author \n 1" Author: \t\t
Post "post 1" -l "comments *" Comment: "\n"
Author "1" -> "reputation 1" Reputation: "\n\n"
Comment "*" -[#han_red,thickness=3]-> "author \n 1" Reputation #text:han_red;

@enduml

Klassendiagram met 5 klasse(n) en 4 relatie(s).

Klassen:

  • Klasse Post met stereotype Aggregate Root met:
    • publieke methode 'addComment', met parameter(s) 'comment', return type void
    • publieke methode 'addComments', met parameter(s) 'comments', return type void
    • geen attributen
  • Klasse Comment met stereotype Entity zonder methoden en attributen
  • Klasse Author met stereotype Aggregate Root zonder methoden en attributen
  • Klasse Reputation met stereotype Value Object zonder methoden en attributen
  • Klasse Reputation #text zonder methoden en attributen

Relaties:

  • Post heeft een associatie-relatie met naam '\t\t' met Author, multipliciteit * naar 1
  • Post heeft een associatie-relatie met naam '"\n"' met Comment
  • Author heeft een associatie-relatie met naam '"\n\n"' met Reputation
  • Comment heeft een associatie-relatie met naam 'han_red;' met Reputation #text, multipliciteit * naar 1

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

4184e75d356c8c5c424342f74dbab08b

PlantUML broncode voor "comment-author"
@startuml
!define han_red e50056

hide circle

rectangle "Post Aggregate" {

class Post <<Aggregate Root>> {
addComment(comment)
addComments(comments)
}

class Comment <<Entity>> {
}
}

rectangle "Author Aggregate" {

class Author <<Aggregate Root>> {
}

class Reputation <<Value Object>> {

}
}

Post "*" -> "author \n 1" Author: \t\t
Post "post 1" -d- "comments *" Comment
Author "1" -d-> "reputation 1" Reputation
Comment "*" -u[#han_red,thickness=3]-> "author \n 1" Author #text:han_red;

@enduml

Klassendiagram met 5 klasse(n) en 4 relatie(s).

Klassen:

  • Klasse Post met stereotype Aggregate Root met:
    • publieke methode 'addComment', met parameter(s) 'comment', return type void
    • publieke methode 'addComments', met parameter(s) 'comments', return type void
    • geen attributen
  • Klasse Comment met stereotype Entity zonder methoden en attributen
  • Klasse Author met stereotype Aggregate Root zonder methoden en attributen
  • Klasse Reputation met stereotype Value Object zonder methoden en attributen
  • Klasse Author #text zonder methoden en attributen

Relaties:

  • Post heeft een associatie-relatie met naam '\t\t' met Author, multipliciteit * naar 1
  • Post heeft een associatie-relatie met naam 'comments *' met Comment
  • Author heeft een associatie-relatie met naam 'reputation 1' met Reputation
  • Comment heeft een associatie-relatie met naam 'han_red;' met Author #text, multipliciteit * naar 1
SQL
create table Comment(
...
author int,
foreign key (author) references Author(id)
...
);
Java
public class Comment {
...
private AggregateReference<Author, Integer> author;
...
}

2C. Aggregate root naar aggregate root van andere aggregate

1a8690bd6c5971fbfec4dd4492871853

PlantUML broncode voor "post-author"
@startuml
!define han_red e50056

hide circle

rectangle "Post Aggregate" {

class Post <<Aggregate Root>> {
addComment(comment)
addComments(comments)
}

class Comment <<Entity>> {
}
}

rectangle "Author Aggregate" {

class Author <<Aggregate Root>> {
}

class Reputation <<Value Object>> {

}
}
Post "post 1" -- "comments *" Comment
Post "*" -[#han_red,thickness=3]r-> "author \n 1" Author #text:han_red;: \t\t
Author "1" -d-> "reputation 1" Reputation

@enduml

Klassendiagram met 5 klasse(n) en 3 relatie(s).

Klassen:

  • Klasse Post met stereotype Aggregate Root met:
    • publieke methode 'addComment', met parameter(s) 'comment', return type void
    • publieke methode 'addComments', met parameter(s) 'comments', return type void
    • geen attributen
  • Klasse Comment met stereotype Entity zonder methoden en attributen
  • Klasse Author met stereotype Aggregate Root zonder methoden en attributen
  • Klasse Reputation met stereotype Value Object zonder methoden en attributen
  • Klasse Author #text zonder methoden en attributen

Relaties:

  • Post heeft een associatie-relatie met naam 'comments *' met Comment
  • Post heeft een associatie-relatie met naam 'han_red;: \t\t' met Author #text, multipliciteit * naar 1
  • Author heeft een associatie-relatie met naam 'reputation 1' met Reputation
SQL
create table Post (
...
author int,
foreign key (author) references Author(id)
...
);
Java
public class Post {
...
private AggregateReference<Author, Integer> author;
...
}