Récupération Blob base de données MySQL dans l'application Hibernate / JSF
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.
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[]
etCharacter[]
); é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'annotationBasic
. ALob
peut être soit un binaire ou caractère type. Le type deLob
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.
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;