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 "の値が正しくありません。しかし、タイプlongが必要なのは誰ですか?変数「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";
}
どんなアドバイスも適用されます。
テーブルを作成したとき、たまたま「名前」列が最初でした。それは良いことではありません。 Idは最初の列でなければなりません。列の順序を変更すると、正常に機能します...
同様の問題が発生しましたが、データベースのIDフィールドの順序とは関係ありませんでした。
いくつか検索した後、 this HibernateのLobsが特に指定されていない限りOIDとして扱われるという事実を示していることがわかりました。
つまり、HibernateはLobをLongに入れようとするため、その例外が生成されますPSQLException:long型の値が正しくありません
Lobがテキストとして扱われることを指定する方法は、フィールドに注釈を付けることです。
@Lob
@Type(type = "org.hibernate.type.TextType")
最初は設定してみました
@Column(columnDefinition = "text")
すでにここで述べたように、@ Lobアノテーションの代わりに。 PostgreSQLでは機能しましたが、エラーorg.hibernate.tool.schema.spi.SchemaManagementException:Schema-validation:テーブル[Question]の列[htmlText]で間違った列タイプが見つかりました。 [clob(Types#CLOB)]が見つかりましたが、[text(Types#VARCHAR)]が必要です
私のユニットテスト(HSQLDB上)で。
それから試してみました
@Column(columnDefinition = "clob")
そしてそれはPostgreSQLとHSQLDBの両方でうまく機能します!