2012-09-28 27 views
11

Quiero almacenar una entidad (una cadena + una imagen) en PostgresQL utilizando Spring MVC e Hibernate Aquí está mi tabla. La imagen se supone que es el tipo de oid.mal valor para tipo largo: - Postgresql, Hibernate, Spring

CREATE TABLE document 
(
    name character varying(200), 
    id serial NOT NULL, 
    content oid, // that should be the image 
    CONSTRAINT document_pkey PRIMARY KEY (id) 
) 
WITH (
    OIDS=FALSE 
); 

Aquí está la entidad que quiero almacenar.

@Entity 
    @Table(name = "document") 
    public class Document { 

     @Id 
     @GeneratedValue(strategy = GenerationType.IDENTITY) 
     @Column(name = "id") 
     private Long id; 

     @Column(name = "name") 
     private String name; 

     @Column(name="content") 
      private Blob content; //this is the image 
//getters- setters 

Puede ver que la variable "nombre" es una Cadena, no Larga. Aún cuando envíe el formulario con un valor que no es numérico que arroja org.postgresql.util.PSQLException: Bad value for type long : x

aquí es la forma:

<form:form method="post" action="save.html" commandName="document" enctype="multipart/form-data"> 
    <form:errors path="*" cssClass="error"/> 
    <table> 
    <tr> 
     <td><form:label path="name">Name</form:label></td> 
     <td><form:input path="name" /></td> 
    </tr> 

    <tr> 
     <td><form:label path="content">Document</form:label></td> 
     <td><input type="file" name="file" id="file"></input></td> 
    </tr> 
    <tr> 
     <td colspan="2"> 
      <input type="submit" value="Add Document"/> 
     </td> 
    </tr> 
</table> 
</form:form> 

Si entro en un valor numérico y lo presentará, en Aceptar. Pero cualquier valor no numérico desencadena la excepción mencionada ... Leí que podría deberse a que no uso el OID correctamente, pero no sé qué debería hacer para eliminar esta excepción. En realidad, tampoco entiendo el nombre de la excpeción. Dice "valor incorrecto para el tipo largo". ¿pero quién quiere tipo largo? la variable "nombre" es tipo String !!!!

Por último, aquí es el controlador

@RequestMapping(value = "/save", method = RequestMethod.POST) 
public String save(@ModelAttribute("document") Document document, @RequestParam("file") MultipartFile file) { 

    try { 
     Blob blob = Hibernate.createBlob(file.getInputStream()); 
     document.setContent(blob); 
     documentDao.save(document); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 


    return "redirect:/index.html"; 
} 

se appriciated Cualquier consejo.

+1

Es posible que desee intentar anotar su declaración Blob con la anotación hibernate @Lob. Además, puede ser útil activar la salida de consulta de hibernate para que pueda ver el sql que se está generando y ver si le da una pista de lo que se está enviando a la base de datos. – jcern

+1

@Lob no ayuda, lo siento –

+0

Un OID no puede contener un BLOB. ["El tipo oid se implementa actualmente como un entero de cuatro bytes sin signo."] (Http://www.postgresql.org/docs/9.0/static/datatype-oid.html). Supongo que de ahí viene el error. – madth3

Respuesta

5

cuando creé la tabla, la columna "nombre" pasó a ser la primera. Eso no es bueno. Id debe ser la primera columna. Si cambio el orden de las columnas funciona bien ...

+0

¡Excelente! Estaba algo desesperado atrapado en el mismo problema. Me has salvado el día. ¡Gracias! – hugoeiji

+0

@Regenbogenfisch - ¿cómo cambiar el orden o la columna? También estoy enfrentando este problema. Lo he intentado en pgAdmin III pero no puedo, ¿me ayudarás? –

+0

simplemente suelte la tabla y vuelva a crearla. –

36

Tuve un problema similar pero no estaba relacionado con el orden del campo ID en la base de datos.

Después de algunas búsquedas encontré this señalando el hecho de que los Lobs en Hibernate se tratan como OID a menos que se especifique lo contrario.

Eso significa que Hibernate intentará poner un globo en un largo de una por lo tanto, producir esa excepción PSQLException: Mala relación tipo largo

La forma de especificar que la pelota alta es una que ha de tratarse como texto es mediante anotaciones el campo

@Lob 
@Type(type = "org.hibernate.type.TextType") 
+1

Gracias! ¡El mismo problema aqui! – zhengyue

+1

¡Gracias, esto fue realmente útil! – NumberFour

+4

También podría usar '@Column (columnDefinition =" text ")' en lugar de lob + type. – membersound

-1

que enfrentó error smiler y la razón era que estaba teniendo algunos caracteres que no sea número entero en el tipo de datos entero presentada

EG, 111 y 144- etc

Cuestiones relacionadas