Comment retourner ids sur Inserts avec Ibatis (avec le mot clé RETURNING)
Je suis en utilisant iBatis/Java et Postgres 8.3.
Quand je fais un insert dans ibatis j'ai besoin de l'id retourné.
J'utilise le tableau suivant pour décrire ma question:
CREATE TABLE sometable ( id serial NOT NULL, somefield VARCHAR(10) );
La Séquence sometable_id_seq
obtient automatiquement générée par l'exécution de l'instruction de création.
En ce moment j'utilise le sql suivant la carte:
<insert id="insertValue" parameterClass="string" >
INSERT INTO sometable ( somefield ) VALUES ( #value# );
<selectKey keyProperty="id" resultClass="int">
SELECT last_value AS id FROM sometable_id_seq
</selectKey>
</insert>
Il semble que ce soit le ibatis moyen de récupérer la nouvelle id inséré. Ibatis première exécute une instruction INSERT et après, il demande à la séquence de la dernière id.
J'ai des doutes que cela fonctionne avec de nombreuses insertions simultanées. ( discuté de cette question )
Je voudrais utiliser l'instruction suivante avec ibatis:
INSERT INTO sometable ( somefield ) VALUES ( #value# ) RETURNING id;
Mais quand j'essaie de l'utiliser au sein d'un <insert>
ibatis sqlMap ne pas retourner l'id. Il semble que le besoin d'une <selectKey>
tag.
Donc, voici la question:
Comment puis-je utiliser l'instruction ci-dessus avec ibatis?
source d'informationauteur Christoph
Vous devez vous connecter pour publier un commentaire.
La
<selectKey>
élément est un enfant de la<insert>
élément et son contenu est exécuté avant le principalINSERT
déclaration. Vous pouvez utiliser deux approches.Extraction de la clé après que vous avez inséré le record
Cette approche fonctionne en fonction de votre pilote. Le filetage peut être un problème avec cette.
De l'extraction de la clé avant de l'insérer l'enregistrement
Cette approche permet d'éviter les problèmes de threading mais c'est plus de travail. Exemple:
Sur le Java côté, vous pouvez alors faire
Cela devrait vous donner la clé sélectionnée à partir de la
my_id_seq
séquence.Ici est simple exemple:
Et dans le code Java:
De cette façon, plus de mieux que d'utiliser :