Dans mon projet, j’ai un champ “Status” qui contient une ENUM
Selon certaines actions de l’utilisateur, je souhaiterai que ce champ enum soit automatique modifié
Voici mon code en partie:
Un attribut enumeré ne peut pas prendre n’importe quelle valeur => il ne peut prendre qu’un des code de la liste de valeur, sinon vous aurez un message d’erreur.
Si la liste de valeur en question porte ne plus un state model vous ne pourrez faire que les transitions explicitement autorisées au user qui fait la manip (i.e. le user qui a instancié l’objet sur lequel vous faites la transition)
Non si les valeurs existent, si la transition existe et si le user qui instancie l’objet est habilité à cette transition, automatiser la transition par du code marchera forcément.
Par contre je pense qu’il faut être dans un contexte où la old value est correctement positionnée. Si vous ne savez pas si c’est le cas dans votre contexte particulier faites le explicitement :
ObjectField s = getField("myStatusField");
s.setOldValue("MYOLDSTATUS");
s.setValue("MYNEWSTATUS");
(...)
Les trois existent, les valeurs dans l’enum, la transition et le user qui a les droits, cependant ca marche pour “Validated” mais pas pour “Draft” alors qu’ils ont exactement les mêmes formats
A savoir que pour mon code, il n’y aura pas les deux changement de statut à la suite, pour mon post, j’ai mis les deux statuts seulement à titre d’exemple, mais dans mon cas concret, il n’y aura que un seul changement de statut, soit l’objet est au statut draft et passe à validated, soit l’inverse et c’est là où le probleme arrive, c’est que ca marche de draft à validated mais quand j’essaye de faire de validated à draft, a chaque fois j’ai le message d’erreur ERR_ENUM: status
Du coup, je suppose qu’il ne devrait pas y avoir de probleme de oldValue vue même si je fais qu’un seul changement de statut (validated vers draft) je reçois quand meme une erreur
Il faut que la old et new value soient cohérentes vis à vis du state-model chargé en mémoire.
Donc comme pour toute mise à jour le pattern est le suivant :
synchronized(obj)
obj.select(id) : si on n’est pas déjà sur l’enregistrement
obj.setStatus(“B”) : le select a permis de valoriser oldvalue=“A” et de charger les bons états
validateAndSave() : ok si A=>B habilité
Si on fait N mises à jour, il faut faire N fois ce traitement.
Le synchronize est obligatoire pour éviter les concurrences d’accès sur l’instance. (sinon entre le select et le save, le statut peut être écrasé par un autre thread dans la même session)