2012-09-28 24 views
11

Spring MVCとHibernateを使用してPostgresQLにエンティティ(String +イメージ)を格納したい ここは私のテーブルです。イメージはoidの型であるはずです。タイプlongの値が正しくありません: - 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"がLongではなく文字列であることがわかります。私は数値を入力し、[OK]を、それを提出した場合

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

:私はそれがここに

org.postgresql.util.PSQLException: Bad value for type long : xをスロー数値ではない値でフォームを送信すると、まだ形です。しかし、数値以外の値が上記の例外を引き起こします...私はOIDを正しく使用していないことが原因である可能性があると読んでいますが、この例外を排除するために何をすべきか分かりません。実際に私は腹筋の名前も理解していません。 「が長すぎ、の値が不正です」と表示されます。誰が長くタイプしたいですか? 変数 "name"はString型です!

は最後に、ここに何かアドバイスがにappriciatedされるコントローラ

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

です。

+1

Blob宣言にhibernate @Lobアノテーションを付けることができます。また、hibernateのクエリ出力を有効にして、生成されているsqlを表示し、データベースに送信されているものに関するヒントが表示されるかどうかを確認することもできます。 – jcern

+1

@Lob 助けてくれない、ごめんなさい –

+0

OIDはBLOBを保持できません。 ["oid型は現在、符号なし4バイト整数として実装されています。"](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がテキストとして扱われることを指定する方法のための悪い値は、注釈を付けることですフィールド

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

ありがとう!同じ問題がここにある! – zhengyue

+1

ありがとう、これは本当に役に立ちました! – NumberFour

+4

lob + typeの代わりに '@Column(columnDefinition =" text ")'を使用することもできます。 – membersound

-1

私はsmilerエラーに直面し、その理由は、私が提出された整数データ型の整数以外の文字を持っていたということであった

EG-、111及び144-など

関連する問題