IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Oracle TopLink error


Sujet :

Java

  1. #1
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 093
    Par défaut Oracle TopLink error
    Bonjour,

    J'ai un problème bizarre avec cette technologie. Je travaille sous NetBeans, et dans un de mes projets, j'utilise les eléments mis en place par l'option "Entity Class From Database..." qui ajoute dans le projet un tas de choses. Cette précision donnée, voilà le détail de mon prolbème:
    Lorsque je réalise une requete telle que :
    INSERT INTO table (Nom, Prenom, titre) VALUES("toto", "titi", "ceci est un test ?");
    et que j'invoque la méthode executeUpdate du Query obtenu par un createNativeQuery de la requete ci-dessus, j'obtient un message d'erreur que je ne comprends pas :
    Local Exception Stack:
    Exception [TOPLINK-6132] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.QueryException
    Exception Description: Query argument " not found in list of parameters provided during query execution.
    Query: DataModifyQuery().........

    Et tenez-vous bien, si j'enlève le caractère "?" de la chaîne "ceci est un test ?" ça fonctionne sans problèmes ??????

    POURQUOI ?

    Si quelqu'un peut m'aider, merci.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  2. #2
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 093
    Par défaut Les recherches continuent...
    N'ayant pas de réponse, je suppose que la question est trop floue, ou mal formulée.
    Pour ma part, j'ai compris pourquoi le caractère "?" n'était pas accecpté par la transaction. En fait, ce dernier n'est pas lu, mais interpreté comme positionneur d'un parametre dans la requete. Il sert aux requetes paramétrées. Dans mon cas, ce n'est pas une requête parametrée, c'est seulement une requete qui cherche a fixer une valeur de type varchar(255) dans un nouvel enregistrement par le biais d'un INSERT SQL tout ce qu'il y a de plus basique. Malheureusement, je ne trouve aucun moyen de faire comprendre à toplink, que dans ce cas, mon point d'interrogation ne doit pas être interpreté.
    Petit exemple de code qui révèle le problème :

    entityManager1 = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("BibAdminPU").createEntityManager(); //BibAdminPU étant le fichier xml de persistence qui contient la définition de la connexion à ma base MySQL.

    javax.persistence.Query requete = entityManager1.createNativeQuery("INSERT INTO table (champ1, champ2) VALUES (\"cuisine\", \"Avez-vous trouvé ça bon ?\");");

    entityManager1.setFlushModeType(FlushModeType.COMMIT);

    javax.persistence.EntityTransaction transaction = entityManager1.getTransaction();

    transaction.begin();

    requete.executeUpdate();

    transaction.commit();

    Fin du code exemple.
    Lors de l'exécution de la ligne executeUpdate, j'obtient le message d'erreur :
    Local Exception Stack:
    Exception [TOPLINK-6132] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.QueryException
    Exception Description: Query argument " not found in list of parameters provided during query execution.
    Query: DataModifyQuery().........

    En fait, le mécanisme d'exécution détecte le point d'interrogation comme positionneur de paramètre, qu'il appelle Query argument, mais aucun parametre n'est fourni dans la requete, d'où l'erreur...
    Embêtant n'est-ce pas. d'autant que je ne trouve aucuns moyen d'éviter l'interpetation du "?".
    J'ai alors orienté mes recherches vers un autre fournisseur de mécanisme de persistance, et mon attention c'est vue retenue par Hibernate.
    J'ai donc ajouté le Plugin Hibernate à mon NetBeans, j'ai régénéré mes entités sur hibernate dans netbeans, et là, succès, le "?" n'est plus un problème, maintenant, c'es le caractère ":" qui passe pas....
    Evidement, je vous le donne dans le mille, avec hibernate, le caractère de positionnement d'un parametre dans une requete, c'est le caractère ":".
    Cependant, j'ai remarqué la chose suivante. Si je remplace la ligne 1 ci-dessous, par la ligne 2, ça marche avec hibernate :

    ligne 1 : entityManager1.createNativeSuery("INSERT INTO table (champ1, champ2) VALUES (\"Santé\", \"Alcoolisme : il faut en parler!\");");

    ligne 2 : entityManager1.createNativeSuery("INSERT INTO table (champ1, champ2) VALUES (\"Santé\", CONCAT(\"Alcoolisme \", \":\", \" il faut en parler!\"));");

    Mais si je tiens le même résonnement, et que de retour avec TopLink je tente une concaténation du caractère "?", ça ne fonctionne pas, malgré l'enfermement du caractère dans une fonction, cet abrutit de toplink continue d'interpeter le caractère, et l'erreur se manifeste à nouveau.

    Bref, ce serait bien si ça s'arrêtait là, il me suffirait de choisir hibernate, et de concaténer le ":", mais j'ai malheureusement la contrainte d'usage de Toplink qui m'est imposée et je ne peux y dérroger. Alors la question reste ouverte :

    Si quelqu'un sait comment insérer une ligne dans une table Mysql comportant un champ de type varchar(255), une chaîne contenant le caractère "?" avec la technologie EJB-JPA et le fournisseur de persistence toplink-essential ???

    Un grand merci à tous ceux qui se pancherons sur ce problème !
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  3. #3
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    As-tu testé en échappant le '?'?


  4. #4
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 093
    Par défaut As-tu testé...
    Je vois que vous avez compris mon problème. J'ai éffectivement testé l'échappement avec anti-slash, mais ça ne change rien, le point d'interrogation est toujours interpreté...

    J'ai finalement réussi à convaincre mes collaborateurs pour l'usage d'Hibernate, et du coup, j'ai mis en place la solution dont je parle, et je concatene un ":" quand il y en a un.

    Mais je reste ouvert à toute solutions ou explications.

    Merci à vous HEIMDAL.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  5. #5
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 093
    Par défaut Reponse
    J'ai enfin compris quelle était mon erreur. Je m'entêtais à réaliser des requetes SQL directement, alors que cette technologie est en fait conçue pour ne plus s'embêter comme ça. En fait, il suffit de créer une nouvelle instance de l'EJB représentant la table dans laquelle on veut insérrer des lignes, puis, via la methode adéquat, on remplis cette table "vide" avec les enregistrement que l'on veut ajouter comme si on remplissait un JTable. Une fois les lignes ajoutées à l'EJB, il ne reste plus qu'à invoquer sa persistence pour qu'il mette à jour la base de données et ajoute concrètement les lignes à la vraie table. Toute la mécanique fonctionnelle est automatique et les transaction auto-gérées. Bref, c'est 200 fois plus simple, il n'y a pas besoin de prendre de précautions particulières, et en plus, on peut annuler... bref, en voulant absolument exécuter mes propres requetes, j'étais tout simplement à côté de la plaque.
    Bref, cet question a trouvé réponse.

    Merci à ceux qui ont pris la peine de me lire et qui ont essayé de m'aider.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/03/2009, 10h19
  2. Oracle 10g (+Rman) - Error Drop Datafile
    Par alfb59 dans le forum Recovery Manager
    Réponses: 22
    Dernier message: 27/06/2007, 10h58
  3. Réponses: 3
    Dernier message: 04/11/2005, 14h20
  4. Réponses: 2
    Dernier message: 30/08/2005, 14h11
  5. Connexion BDD oracle TNS protocol adapter error
    Par cedrickb dans le forum Access
    Réponses: 3
    Dernier message: 30/12/2004, 13h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo