2010-09-13 8 views
2

Je suis nouveau dans le monde Hibernation et je l'utilise pour mapper une table qui stocke des fichiers de tous types. Je RECEVOIR cependant une erreur très étrange:Utilisation de longblob en veille prolongée

javax.servlet.ServletException: java.lang.ClassCastException: [B cannot be cast to java.sql.Blob 

Je cartographié ma MySql colonne LONGBLOB a: <property name="fileData" type="blob" .../> et <property name="fileData" type="longblog" .../>, mais les deux ne fonctionnent pas. J'utilise actuellement Spring mvc version 3.x la dernière version et Tomcant 7 si cela aide.

edit: voici comment mon POJO ressemble à FileObject:

com.kc.models de paquet;

public class FileObject {

private String fileName; 
private String type; 
private double size; 
private byte[] file; 
private int id; 

public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 
public String getFileName() { 
    return fileName; 
} 
public void setFileName(String fileName) { 
    this.fileName = fileName; 
} 
public String getType() { 
    return type; 
} 
public void setType(String type) { 
    this.type = type; 
} 
public double getSize() { 
    return size; 
} 
public void setSize(double size) { 
    this.size = size; 
} 
public byte[] getFile() { 
    return file; 
} 
public void setFile(byte[] file) { 
    this.file = file; 
} 

}

Et voici comment mon fichier hbm.xml ressemble:

<class name="com.kc.models.FileObject" table="FILES"> 
    <id name="id" column="ID"> 
     <generator class="native" /> 
    </id> 
    <property name="fileName" type="string" column="FILENAME" /> 
    <property name="type" type="string" column="TYPE" /> 
    <property name="size" type="double" column="SIZE" /> 
    <property name="file" type="blob" column="FILE" /> 
</class> 

O et est ici un écran d'impression de MySql: http://img412.imageshack.us/img412/3663/fileobject.jpg

+0

Quel est le type de 'fileData'? Pouvez-vous montrer la classe mappée? –

+0

\t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t – jonney

+0

le nom de propriété du fichier ne fonctionne pas – jonney

Répondre

2

Le message d'exception dit que vous essayez de jeter un byte[] (représenté comme [B) à un java.sql.Blob:

java.lang.ClassCastException: [B cannot be cast to java.sql.Blob 

Le problème semble être Si vous avez défini le fichier de propriétés POJO comme byte[], vous le mappez en tant que java.sql.Blob au mappage Hibernate.

Essayez de changer le type de propriété au POJO:

package com.kc.models; 
public class FileObject { 
    //... 
    private java.sql.Blob file; 
    //... 
} 
+2

http://i-proving.ca/space/Technologies/Hibernate/Blobs+and+Hibernate - exemple de conversion de Blob en byte [] et byte [] en Blob. – MarrLiss

+0

Puis-je encore écrire des tableaux d'octets dans un fichier java.sql.Blob et a-t-il une taille limitée? la raison pour laquelle j'ai défini un longblob dans mysql est que je peux stocker de gros fichiers et j'ai entendu le "blog" par défaut ne stocke pas beaucoup d'octets. – jonney

+0

@MarrLiss merci pour le lien (+1) –

0

Essayez de faire que vous utilisez @access (FIELD) pour une raison étrange en cours d'exécution sur l'environnement JaveSE (c.-à-test JUnit) et l'environnement JaveEE (par exemple Glassfish) J'ai des résultats différents mais cela a été rendu cohérent quand j'ai ajouté l'annotation @Access.

0
public Blob getFile() { 
    return Hibernate.createBlob(file); 
} 
+0

Vous devriez donner un peu plus d'informations sur ce que fait votre code. – Jimbo