Question

Je suis un peu de difficulté données blob récupérer correctement de ma base de données en utilisant java dans mon application JSF 2.0. Le premier problème que j'ai est sur ma méthode de lecture pour le « fichier » Blob nommé je reçois une erreur disant que « Les attributs de base ne peuvent être des types suivants ... » essentiellement en disant que je ne peux pas retourner un objet blob. Mon code ressemble à ce qui est ci-dessous. Même avec l'erreur mon code compile. J'ai créé une méthode d'essai (le dernier morceau de code ci-dessous) et a essayé de tester mais il me donne des erreurs d'exécution.

Bean Controller

import java.sql.Blob;

@Entity
@Table(named = "files")
@NamedQueries( {
    @NamedQuery(name = "MyBlob.getBlob",
    query = from MyBlob WHERE fileId =: fileId")
})
public class MyBlob implements Serializable {

     private Integer fileId;
     private Blob file;
     ...

     public Integer getFileId() {
         return fileId;
     }

     public void setFileId() {
         this.fileId = fileId;
     }

     public Blob getFile() {
         return file;
     }

     public void setFile(Blob file) {
         this.file = file;
     }

     ....

}

BlobDao.java méthode de fichier pour obtenir blob

public MyBlob getBlob(Integer fileId) throws HibernateException {
    Session session = getSessionFactory().openSession();
    try { 
      MyBlob blob = (MyBlob)session.getNamedQuery("MyBlob.getBlob").setInteger("fileId", fileId).uniqueResult();
      return blob;
    } catch(HibernateException e) {
         throw new HibernateException(e);
    } finally {
        session.close();
    }
}

TestDao.java

@Test
public void testBlob() {

    MyBlob test = blobdao.getBlob(1);  // 1 is a fileId that exists in the DB with a blob image file.
    Blob blob = test.getFile();
    try {
        System.out.println(blob.length));   //this prints a number but I dont think the right one. 
        if(blob.length > 0 ) {
             System.out.println(blob.toString() ); //errors out here
        }
    } catch(SQLException e) {
          return System.out.println("Failed");
    }
}

Je ne suis pas sûr que je fais ce droit du tout. Toute aide est la bienvenue. Merci.

Était-ce utile?

La solution

  

sur ma méthode de lecture pour le « fichier » Blob nommé je reçois une erreur disant que « Les attributs de base ne peuvent être des types suivants ... » essentiellement en disant que je ne peux pas retourner un objet blob.

En effet, un java.sql.Blob est pas un champ persistant ou des biens qui peuvent être mis en correspondance par Hibernate / JPA. La spécification JPA met est comme ceci:

  

2.1.1 Les champs persistants et propriétés

     

...

     

Les champs persistants ou propriétés   une entité peut être la suivante   types: Java types primitifs;   java.lang.String; autre Java   types sérialisables (y compris les emballages   des types de primitives,   java.math.BigInteger,   java.math.BigDecimal, java.util.Date,   java.util.Calendar, java.sql.Date,   java.sql.Time, java.sql.Timestamp,   défini par l'utilisateur types sérialisables,   byte[], Byte[], char[] et   Character[]); énumérations; types d'entités   et / ou des collections de types d'entités;   et les classes intégrables (voir la section   2.1.5).

Vous devriez probablement utiliser l'annotation Lob et changer votre type d'attribut. De la spécification:

  

9.1.19 Lob Annotation

     

Une annotation Lob précise qu'un   propriété persistante ou sur le terrain devraient être   persisté comme un objet de grande taille à une   grand type d'objet base de données pris en charge.   Les applications portables doivent utiliser la   annotation Lob lors du mappage à un   base de données type Lob. le Lob   annotation peut être utilisée conjointement   avec l'annotation Basic. A Lob   peut être soit un binaire ou caractère   type. Le type de Lob est déduit de   le type du champ persistant ou   la propriété et à l'exception des cordes et   types à base de caractères par défaut   Blob.

     

...

     

Exemple 1:

@Lob @Basic(fetch=EAGER)
@Column(name="REPORT")
protected String report;
     

Exemple 2:

@Lob @Basic(fetch=LAZY)
@Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
protected byte[] pic;

Références

  • spécification JPA 1.0
    • Section 2.1.1 "Les champs persistants et propriétés"
    • Section 9.1.19 "Lob Annotation"

  

Eh bien mes besoins exacts doivent récupérer le Blob de la base de données soit comme un Blob ou un octet [], tout ce qui fonctionne, et en quelque sorte la convertir en un objet InputStream valide.

Qu'en est-il

Autres conseils

Je devine l'objet Blob est votre entité. Il peut être utile si vous imprimez aussi.

Assurez-vous que vos déclarations de Blob byte[]

@Basic(fetch = FetchType.LAZY)
@Lob             
@Column(length = 104857600, nullable = false)
private byte[] data;
scroll top