Frage

Ich habe einige Probleme richtig Abrufen von BLOB-Daten aus meiner Datenbank java in meiner JSF 2.0-Anwendung. Das erste Problem, das ich habe, ist auf meiner Getter-Methode für die Blob namens „Datei“ Ich erhalte eine Fehlermeldung, dass „Grundattribut nur der folgenden Typs sein kann ...“ im Grunde sagt, dass ich nicht ein Blob-Objekt zurückgeben kann. Mein Code sieht, was unten ist. Auch mit dem Fehler meines Code kompiliert. Ich habe ein Testverfahren (das letzte Stück Code unten) und versuchte zu Test erstellt, aber es gibt mir Fehler Laufzeit.

Controller 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 Datei-Methode, um 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");
    }
}

Ich bin nicht sicher, dass ich dieses Recht überhaupt täte. Jede Hilfe wäre toll. Danke.

War es hilfreich?

Lösung

  

auf meinem Getter-Methode für die Blob namens „Datei“ ich einen Fehler erhalten, dass „Grundattribute nur der folgenden Typen sein kann ...“ im Grunde sagen, dass ich nicht ein Blob-Objekt zurückgeben kann.

Tatsächlich ist ein java.sql.Blob ist kein schwer abbaubares Feld oder eine Eigenschaft, die von Hibernate / JPA abgebildet werden kann. Die JPA-Spezifikation legt ist wie folgt:

  

2.1.1 Persistent Felder und Eigenschaften

     

...

     

Die persistenten Felder oder Eigenschaften   ein Unternehmen kann aus der folgenden sein   Typen: Java primitive Typen;   java.lang.String; andere Java   serializable Typen (einschließlich Wrapper   der primitiven Typen,   java.math.BigInteger,   java.math.BigDecimal, java.util.Date,   java.util.Calendar, java.sql.Date,   java.sql.Time, java.sql.Timestamp,   benutzerdefinierten serializable Typen,   byte[], Byte[], char[] und   Character[]); Aufzählungen; Entitätstypen   und / oder Sammlungen von Entitätstypen;   und integrierbare Klassen (siehe Abschnitt   2.1.5).

Sie sollten wahrscheinlich die Lob Anmerkung verwenden und Ihren Attributtyp verändern. Aus der Beschreibung:

  

9.1.19 Löb Annotation

     

Ein Lob Anmerkung gibt an, dass ein   persistente Eigenschaft oder ein Feld soll   blieb als ein großes Objekt in einem   Datenbank-gestützte großen Objekttypen.   Portable Anwendungen sollte die Verwendung   LOB Annotation, wenn sie eine Zuordnung   Datenbank-LOB-Typ. die Lob   Anmerkung kann in Verbindung verwendet werden,   mit der Basic Anmerkung. Ein Lob   kann entweder ein binäres oder ein Zeichen sein,   Art. Der Lob Typ wird daraus geschlossen   der Typ des Feldes oder persistent   Eigentum, und mit Ausnahme von String und   zeichenbasierte Typen standardmäßig   Blob.

     

...

     

Beispiel 1:

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

Beispiel 2:

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

Referenzen

  • JPA 1.0-Spezifikation
    • Abschnitt 2.1.1 "Persistent Felder und Eigenschaften"
    • Abschnitt 9.1.19 "Lob Annotation"

  

Nun meine genauen Anforderungen sind die Blob aus der Datenbank abgerufen wird entweder als Blob oder ein byte [], was auch immer funktioniert, und dann irgendwie konvertieren, dass in ein gültiges Input Objekt.

Was ist

Andere Tipps

Ich vermute, das Blob Objekt ist Ihr Entity. Es könnte helfen, wenn Sie das auch drucken.

Stellen Sie sicher, Ihre Blob kehrt byte[]

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