Création via adaptateur

Bonjour,

Quand je crée une ligne d’un objet via un adaptateur, la méthode create() me retourne toujours “null” même quand il y a une erreur lors de la création.
Ex :
Dans mon fichier csv, une des valeurs dépasse la taille max du champ.
Dans le cas d’une mise à jour ( utilisation de save()), la mise à jour n’est pas effectuée et le save() me retourne “ERR_SAVE”
Dans le cas d’une création (utilisation de create()), la création n’est pas effectuée mais le create() me retourne un “null” comme si la création avait réussi.

Je reproduis ce comportement en 3.2

Simplicité® version 3.2.M07 (built on 2018-04-10 for tomcat 8), encoding UTF-8 (system encoding UTF-8)

et aussi en 4.0

Simplicité version 4.0 patch level P23 (database patch level P23)Built on2019-05-28 20:50 (revision b4dcc121cee1b86e41ba9d3091d49d85726fd4c3) for tomcat 8EncodingUTF-8 (system encoding UTF-8)

Vous n’avez pas indiqué de quelle base de données on parle ici…

Sur l’environnement 3.2, nous utilisons MySQL 5.6.43-log.
Sur l’environnement 4.0, nous utilisons MySQL 5.5.60-MariaDB using BLOBs.

OK il me semblait pourtant que MySQL et MariaDB tronquent les valeurs qui ne rentrent pas dans les colonnes…

Ceci a peut être un lien avec le nouveau driver JDBC MySQL 8.x qui rend les choses peut être moins tolérantes par défaut.

Merci de nous indiquer quels drivers vous utilisez sur vos instances.

Mais de toute façon la solution logique c’est déjà de tronquer vos valeurs à la longueur de l’attribut correspondant au niveau de votre adapter.

De notre coté on va regarder si on peut forcer cette troncature dans les couches basses sans compromettre le cas général

Si vous faites uniquement un save(), c’est la base de données qui fera ce qu’elle peut (Oracle renvoie une erreur alors que MySQL tronque la donnée).

A noter que le validate() tronque automatiquement le champ s’il dépasse la longueur paramétrée.
Il convient de toujours faire un validate au cas où il y ait également des pre/postValidate codés dans l’objet.

Il existe un helper pour vous faciliter la tache de faire un validate+save propre / tester s’il y a des erreurs et faire le save si ok :

new BusinessObjectTool(obj).validateAndSave();

cf hooks
https://docs.simplicite.io/documentation/01-core/businessobject-code-hooks.md

et javadoc
https://docs.simplicite.io/4.0/javadoc/com/simplicite/util/tools/BusinessObjectTool.html

L’instance 4.0 utilise le driver mysql-connector-java-8.0.16.jar (instance oscdev2 sur l’instance manager)

Je ne connais pas le driver utilisé sur l’instance 3.2.

OK je regarderai à l’occasion si ce driver n’est pas plus restrictif en termes de troncature de valeur vs la taille de colonne.

Ceci dit la bonne réponse est cette de @Francois: l’appel direct au save/create/update en zappant le validate n’a de sens que si on est certain à 100% que ce qu’on envoie comme données est correct.

Dans votre cas ce n’est visiblement pas le cas. Donc passez par le validate, idéalement via le wrapper BusinessObjectTool et sa methode validateAndSave plutôt que via les methodes bas niveau de ObjectDB.

Cf. https://docs.simplicite.io/documentation/01-core/adapter-code-examples.md

1 Like

L’instance 3.2 utilise le driver version 4.2

Ok mais cf. nos réponses précédentes