Recupero Blob da database MySQL in Hibernate / application JSF
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.
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[]
, eCharacter[]
); 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'annotazioneBasic
. ALob
può essere un binario o carattere genere. Il tipoLob
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;