30

Spring MVC と Hibernate を使用して PostgresQL にエンティティ (文字列 + 画像) を格納したい ここに私のテーブルがあります。画像は oid のタイプであると想定されています。

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 ではなく String であることがわかります。それでも、数値ではない値でフォームを送信すると、スローされます 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を適切に使用していないことが原因である可能性があることを読みましたが、この例外を排除するために何をすべきかわかりません。実際、例外の名前もわかりません。「タイプlongの不適切な値」と表示されます。しかし、誰が長いタイプを望んでいますか?変数「名前」は文字列型です!!!!

最後に、ここにコントローラーがあります

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

どんなアドバイスも歓迎します。

4

5 に答える 5

92

同様の問題がありましたが、データベース内の ID フィールドの順序とは関係ありませんでした。

いくつか検索した結果、特に指定がない限り、Hibernate の Lobs は OID として扱われるという事実を示していることがわかりました

つまり、Hibernate は Lob を Long に入れようとするため、例外PSQLException: Bad value for type long が生成されます。

Lob がテキストとして扱われることを指定する方法は、フィールドに注釈を付けることです。

@Lob
@Type(type = "org.hibernate.type.TextType")
于 2014-02-04T07:57:21.717 に答える
10

テーブルを作成したとき、列「名前」がたまたま最初でした。それは良いことではありません。ID は最初の列である必要があります。列の順序を変更すると、正常に動作します...

于 2012-09-29T19:52:44.447 に答える