Suchen Blob aus MySQL-Datenbank in Hibernate / JSF-Anwendung
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.
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[]
undCharacter[]
); 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 derBasic
Anmerkung. EinLob
kann entweder ein binäres oder ein Zeichen sein, Art. DerLob
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.
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;