Problème
- J'ai une entité parent avec une relation un-à-plusieurs avec l'entité entités enfants.
- Mapstruct est utilisé pour mapper les entités aux DTOs, donc simplement récupérer tout (même paresseusement) résultera en l'instanciation/la récupération de chaque instance à partir de la persistance (ce que nous ne voulons pas, je ne me soucie que des IDs en dehors des classes Spring JPA/Hibernate).
- Les tables du parent et de l'enfant n'ont aucune référence l'une de l'autre, la relation est gérée par une table de jonction.
Je ne m'intéresse qu'aux identifiants des associations. Je ne veux pas que la DTO ait la classe associée respective comme attribut. Je veux Parent
d'avoir Set<String> childIds
y Child
d'avoir String parentId
dans les DTO. Pour cette raison, je ne veux pas charger l'objet entier dans la couche de persistance juste pour faire disparaître tout le reste.
Tentatives
- Faire en sorte que les classes d'entités fassent référence à l'autre classe d'entité. Le DTO de l'entité est ok mais l'entité DTO Entity Hibernate/Spring JPA se plaint que l'entité est détachée (parce qu'elle vient de provenir d'un ID). Une solution à laquelle j'ai pensé est d'appeler
EntityManager.getReference
mais cela provoque une erreur s'il s'agit d'une nouvelle entité, alors comment puis-je en enregistrer de nouvelles ? Je devrais faire unexistsById
mais maintenant nous faisons encore plus d'appels à la base de données, ça devient cher. - Un tas de combinaisons de
JoinColumn
,JoinColumns
,JoinTable
etc.
Classes Java
Entités
@Entity
@(LombokGettersAndSetters)
public class ParentEntity {
@Id
private Long id;
@(???)
private Set<Long> childIds; || private Set<ChildEntity> children;
}
@Entity
@(LombokGettersAndSetters)
public class ChildEntity {
@Id
private Long id;
@(???)
private Long parentId; || private ParentEntity parent;
}
Mappers
(Mapstruct mappers)
DTOs
public class ParentDTO {
private Long id;
private Set<Long> childIds;
}
public class ChildDTO {
private Long id;
private Long parentId;
}
Tableaux
Parent Child Parent_join_Child
------- ----- -----------------
id id parent_id
child_id
Merci d'avance !
Editer @ +1m : Je dois noter que j'ai supprimé certaines annotations dans mes exemples tels que ceux ci-dessous.
@Column(name = "parent_id", columnDefinition = CustomColumnDefinition.UNSIGNED_INT)
@GeneratedValue(strategy = GenerationType.IDENTITY)