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

Hibernate Java Discussion :

[Oracle 10g]Problème pour enregistrer blob


Sujet :

Hibernate Java

  1. #1
    Invité
    Invité(e)
    Par défaut [Oracle 10g]Problème pour enregistrer blob
    Bonjour,

    je bataille depuis plusieurs jours sur la sauvegarde d'une image dans ma base de donnée Oracle.

    j'ai bien trouvé des trucs sur internet mais rien n'a marché et je m'embrouille un peu.

    avez-vous un manière simple pour cela ?

    je sais qu'il faut que le champ ne soit pas vide sous oracle, j'ai donc créer mon champ dans ma table de cette maniere: image BLOB DEFAULT EMPTY_BLOB()

    J'ai plusieurs questions :
    quels type utiliser dans mon fichier de mapping (BLOB oracle, Blob sql, Blob hibernate) ?
    et dans mon code ?

    j'ai cru comprendre qu'on ne peux pas créer un blob directement mais qu'il faut mettre à jour le champ de la table. Mais que faire lorsque la table est vide ?!

    J'ai trouvé de nombreux exemples sur internet mais aucun n'a marché.

    merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Points : 83
    Points
    83
    Par défaut
    Salut,
    il te met quoi comme erreur exactement ?
    Anciennement, j'ai eu un problème avec Oracle et les images mais j'utilisais la cartouche ORDIMAGE où tu peux faire des recherches physiques et gérer des vignettes tout simplement.
    Pour ce faire, j'avais mis ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
           setAutoCommit(false);

  3. #3
    Invité
    Invité(e)
    Par défaut
    non, non, en fait ce que je recherche c'est pouvoir écrire dans mon champs BLOB en passant par la couche Hibernate.

  4. #4
    Invité
    Invité(e)
    Par défaut
    J'ai un objet SibImage qui contient l'adresse de mon image.
    Mon datamodel contient un attribut : SibImage image;
    Je crée donc un type hibernate pour pouvoir transfomé mon adresse d'image en BLOB (oracle).

    Voci ma classe SibImageBlobType (seule la méthoe Set nous intéresse) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
        if (value == null) {
          // pas d'image
          st.setNull(index, Types.BLOB);
          return;
        }
     
        InputStream inStream = null;
        try {
     
          // création d'une connexion vers l'image
          URLConnection urlCnx = ((SibImage) value).getImageUrl().openConnection();
     
          //récupération du flux
          inStream = urlCnx.getInputStream();
     
          //    lecture du flux et écriture dans un tableau de bytes
          ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream(1024);
          for (int val; (val = inStream.read()) != -1;) {
            byteArrayStream.write(val);
          }
          st.setBlob(index, BLOB.empty_lob());
    }
    ca c'est ce qui marche, normal je ne fais rien, mais bon l'insertion d'un blob vide fonctionne correctement.

    Donc si je rajoute ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
        if (value == null) {
          // pas d'image
          st.setNull(index, Types.BLOB);
          return;
        }
     
        InputStream inStream = null;
        try {
     
          // création d'une connexion vers l'image
          URLConnection urlCnx = ((SibImage) value).getImageUrl().openConnection();
     
          //récupération du flux
          inStream = urlCnx.getInputStream();
     
          //    lecture du flux et écriture dans un tableau de bytes
          ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream(1024);
          for (int val; (val = inStream.read()) != -1;) {
            byteArrayStream.write(val);
          }
                Connection conn = st.getConnection().getMetaData().getConnection();
     
          BLOB blob = BLOB.createTemporary(conn, false, oracle.sql.BLOB.DURATION_SESSION);
     
          blob.open(BLOB.MODE_READWRITE);
     
          OutputStream out = blob.getBinaryOutputStream();
     
          try {
            out.write(byteArrayStream.toByteArray());
            out.flush();
            out.close();
          }
          catch (IOException e) {
            throw new SQLException("failed write to blob" + e.getMessage());
          }
     
          blob.close();
     
          ((oracle.jdbc.OraclePreparedStatement) (st)).setBLOB(index, blob);
    }
    j'obtiens cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Caused by: java.lang.NoSuchMethodError: oracle.sql.BLOB.createTemporary(Ljava/sql/Connection;ZI)Loracle/sql/BLOB;
    	at fr.ggl.fwk.service.hibernate.types.SibImageBlobType.nullSafeSet(SibImageBlobType.java:119)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Points : 83
    Points
    83
    Par défaut
    excuse moi, je n'avais pas bien lu l'intitulé !!!
    Je ne connais pas trop Hibernate donc je ne peux pas trop d'aider.
    Je suis plus axé sur Jonas.
    Par contre, je ne sais pas trop ce ke tu vas faire avec tes images mais utilise plutot la cartouche ORDIMAGE avec ORDSYS.ORDIMAGE

    Personnelement, quand j'ai utilisé Jonas,j'ai eu des problèmes avec les images mais j'utilisais postgresql 8 .
    Le problème venait que les Stream n'était pas sérialisable mais je vois ke ce n'est pas ton problème.
    Mais, je trouve ca bizarre ke tu créés ton blob comme ca, je me souviens ke c'était plus simple, mais bon je me trompe peut etre

    Allez, bon courage

  6. #6
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2

  7. #7
    Invité
    Invité(e)
    Par défaut
    j'ai résoulu mon pb, c'était un bête pb de driver que je n'avais pas changé partout

    merci.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/10/2007, 17h34
  2. Insertion de BLOB,CLOB,xml avec oracle 10g
    Par Dx_ter dans le forum Coldfusion
    Réponses: 1
    Dernier message: 10/07/2007, 11h34
  3. JDBC pour oracle 10g XE
    Par ayoub2010 dans le forum JDBC
    Réponses: 2
    Dernier message: 08/04/2007, 23h18
  4. Réponses: 2
    Dernier message: 08/10/2006, 17h35
  5. Forms pour Oracle 10g Release 2
    Par cpointet dans le forum Forms
    Réponses: 1
    Dernier message: 11/10/2005, 07h25

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