2012-09-28 64 views
11

我想在PostgresQL中使用Spring MVC和休眠存儲一個實體(一個字符串+圖像) 這是我的表。圖像應該是oid的類型。類型長的不良值: - 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 
); 

這是我想要存儲的實體。

@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 

您可以看到變量「name」是一個字符串,不是長。不過,當我提交表單與值不是數字,它拋出org.postgresql.util.PSQLException: Bad value for type long : x

這裏是形式:

<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> 

如果我輸入一個數值並提交,OK。但是任何非數字值都會觸發上述異常...我讀到它可能是由於我沒有正確使用OID而導致的,但我不知道應該如何消除此異常。其實我也不明白excpetion的名字。它說「類型的價值不好」。但誰想要長型? 變量「name」是String類型的字符串!!!!

最後,這裏是控制器

@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"; 
} 

任何建議是appriciated。

+1

您可能想嘗試使用hibernate @Lob批註註釋您的Blob聲明。此外,它可能有助於打開hibernate的查詢輸出,以便您可以看到正在生成的sql,並查看它是否爲您提供了有關正在發送到數據庫的提示。 – jcern

+1

@Lob 沒有幫助,對不起 –

+0

OID不能容納BLOB。 [「oid類型當前是作爲一個無符號的四字節整數實現的。」](http://www.postgresql.org/docs/9.0/static/datatype-oid.html)。我想這就是錯誤來自的地方。 – madth3

回答

5

當我創建表的列「名稱」碰巧是第一個。這不好。 ID必須是第一列。如果我改變列的順序,它工作正常...

+0

非常好!我有點絕望地陷入了同樣的問題。你已經救了我的一天。謝謝! – hugoeiji

+0

@Regenbogenfisch - 如何更改順序或列?我也面臨這個問題。我已經在pgAdmin III中嘗試過了,但不能,那麼你能幫助我嗎? –

+0

只需刪除表並重新創建它。 –

36

我有一個類似的問題,但它與數據庫中的ID字段的順序無關。

經過一番搜索,我發現this指出了Hibernate中的Lobs被視爲OID的事實,除非另有說明。

這意味着Hibernate會嘗試把一個高吊球到龍一,因此產生異常PSQLException:錯誤的值類型長

指定高球是被作爲文本處理的方式是通過註釋領域

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

謝謝!這裏同樣的問題! – zhengyue

+1

謝謝,這真的很有幫助! – NumberFour

+4

你可以使用'@Column(columnDefinition =「text」)'而不是lob + type。 – membersound

-1

我面對smiler誤差和的原因是,我是具有比提交的整數數據類型整數其它一些字符

EG-111和144-等

相關問題