Open kbuntrock opened 3 months ago
Ca peut poser problème de supprimer le fait que ce soit une association. Il faut donc le mettre en option. Mais en dehors de ça, c'est faisable. Par contre je ne vois pas de nécessité de retransformer typeUtilisateurCode en String, même si effectivement il serait beaucoup moins utilisé.
Quelques remarques :
1- Le converteur ne me parrait pas utile, on peut utiliser directement @Enumerated(EnumType.STRING)
2- J'utilise ma classe EnumLookup qui permet de prendre en charge la recherche d'énumération par Enum::name (return null si pas trouvé :)) Donc pas besoin de surcharger l'énum pour cela.
A lire : https://dzone.com/articles/java-enum-lookup-by-name-or-field-without-throwing
import Collections.associateBy;
import java.util.EnumSet; import java.util.HashMap; import java.util.Map; import java.util.function.Function;
import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j;
@Slf4j @UtilityClass public final class EnumLookup { // Attention on ne peut réinitialiser ce cache, mais c'est uniquement sur des enums private static final Map<Class<?>, Map<?, ?>> cache = new HashMap<>();
public static <T, E extends Enum<E>> Map<T, E> lookupNullable(final Class<E> clazz) {
return (Map<T, E>) lookupNullable(clazz, Enum::name);
}
private static <E extends Enum<E>> Map<String, E> lookupNullable(final Class<E> clazz,
final Function<E, String> mapper) {
final var indexCache = (Map<String, E>) cache.get(clazz);
if (indexCache != null) {
return indexCache;
}
final var index = associateBy(EnumSet.allOf(clazz), mapper);
cache.putIfAbsent(clazz, index);
return index;
}
public static <E extends Enum<E>> E lookupNullable(final Class<E> clazz, final String displayName) {
final E e = lookupNullable(clazz, Enum::name).get(displayName);
if (e == null) {
LOGGER.debug("looking up {} not found ", displayName);
}
return e;
}
}
En présence d'une liste de références immutables, la génération actuelle java génère une entité dont l'attribut primary key devient une enumération. Entrainant une petite gymnastique ensuite suivant si on manipule l'entity ou la primary key seulement.
Je trouve pertinent de générer directement une énumération pour représenter plus fidèlement l'objet référence et simplifier sa manipulation.
Exemple :
Représentation du modèle :
Génération actuelle (2 fichiers) :
TypeUtilisateurCode :
TypeUtilisateur :
Génération souhaitée (2 fichier, mais un seul à manipuler) :
Et le converter associé
Dans les entités associés, la convertion est ensuire indiquée comme telle grace à l'annotation @Convert :
What do you think?