Domanda

Sto avendo qualche difficoltà correttamente il recupero dei dati BLOB dal mio database utilizzando java nella mia applicazione JSF 2.0. Il primo problema che sto avendo è il mio metodo getter per il Blob denominato "file" ottengo un errore che dice che "gli attributi di base possono essere solo dei seguenti tipi di ..." fondamentalmente dicendo che non posso restituire un oggetto Blob. I miei sguardi codice come ciò che è al di sotto. Anche con l'errore mio codice compilato. Ho creato un metodo di prova (l'ultimo pezzo di codice qui sotto) e ha cercato di test, ma mi dà errori di runtime.

Regolatore Bean

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 metodo file per ottenere 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");
    }
}

Non sono sicuro che sto facendo questo diritto a tutti. Qualsiasi aiuto sarebbe grande. Grazie.

È stato utile?

Soluzione

  

sul mio metodo getter per il Blob denominato "file" ottengo un errore che dice che "gli attributi di base possono essere solo dei seguenti tipi di ..." fondamentalmente dicendo che non posso restituire un oggetto Blob.

In effetti, un java.sql.Blob non è un campo persistente o proprietà che può essere mappato da Hibernate / JPA. Le mette specifica APP è in questo modo:

  

2.1.1 persistente campi e proprietà

     

...

     

I campi o proprietà di persistenti   un'entità può essere dei seguenti   tipi: Java tipi primitivi;   java.lang.String; altri Java   tipi serializzabili (tra cui involucri   dei tipi primitivi,   java.math.BigInteger,   java.math.BigDecimal, java.util.Date,   java.util.Calendar, java.sql.Date,   java.sql.Time, java.sql.Timestamp,   definiti dall'utente tipi serializzabili,   byte[], Byte[], char[], e   Character[]); enumerazioni; tipi di entità   e / o raccolte di tipi di entità;   e classi integrabili (vedere il paragrafo   2.1.5).

Si dovrebbe probabilmente usare l'annotazione Lob e cambiare il tuo tipo di attributo. Dalla specifica:

  

9.1.19 Lob annotazione

     

Un Lob un'annotazione specifica che un   proprietà persistente o campo dovrebbero essere   persistito come un oggetto di grandi dimensioni ad un   database supportato grande tipo di oggetto.   applicazioni portatili devono utilizzare il   Lob di annotazione per la mappatura a un   database di tipo Lob. il Lob   nota può essere usata congiuntamente   con l'annotazione Basic. A Lob   può essere un binario o carattere   genere. Il tipo Lob viene dedotto dal   il tipo del campo persistente o   proprietà, e fatta eccezione per archi e   basati su caratteri tipi di default   Blob.

     

...

     

Esempio 1:

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

Esempio 2:

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

Bibliografia

  • JPA specifiche 1.0
    • Sezione 2.1.1 "Persistent campi e proprietà"
    • Sezione 9.1.19 "Lob Annotazione"

  

Bene i miei requisiti esatti sono per recuperare il blob dal database sia come Blob o un byte [], quello che funziona, e quindi in qualche modo convertire in un oggetto InputStream valido.

Che dire di ByteArrayInputStream(byte[]) ?

Altri suggerimenti

Sono indovinando l'oggetto Blob è la vostra entità. Potrebbe essere utile se si stampa che pure.

Assicurati che il tuo rendimento Blob byte[]

@Basic(fetch = FetchType.LAZY)
@Lob             
@Column(length = 104857600, nullable = false)
private byte[] data;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top