我想使用Spring MVC和Hibernate在PostgresQL中存储一个实体(一个String +一个图像) 这是我的桌子。该图像应该是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”是String,而不是Long。仍然当我提交一个非数字值的表单时,它会抛出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>
如果我输入数值并提交,请确定。但是任何非数字值都会触发上面提到的异常......我读到它可能是因为我没有正确使用OID但我不知道该怎么办才能消除这个异常。其实我也不明白这个激动的名字。它说“类型长”的价值不佳。但谁想要打字? 变量“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";
}
任何建议都是适当的。
答案 0 :(得分:47)
我有一个类似的问题,但它与数据库中ID字段的顺序无关。
经过一番搜索后,我发现this指的是Hibernate中的Lobs被视为OID,除非另有说明。
这意味着Hibernate会尝试将Lob放入Long a因此产生异常 PSQLException:类型为long的值
指定Lob是一个被视为文本的方法是通过注释字段
@Lob
@Type(type = "org.hibernate.type.TextType")
答案 1 :(得分:7)
当我创建表时,“name”列恰好是第一个。这不好。 Id必须是第一列。如果我改变列的顺序,它可以正常工作......
答案 2 :(得分:0)
起初我尝试设置
@Column(columnDefinition = "text")
代替@Lob注释,如此处已提到的。它在PostgreSQL上对我有用,但是有错误 org.hibernate.tool.schema.spi.SchemaManagementException:模式验证:表[问题]的列[htmlText]中遇到错误的列类型;找到了[clob(Types#CLOB)],但期望是[text(Types#VARCHAR)]
在我的单元测试中(在HSQLDB上)。
然后尝试
@Column(columnDefinition = "clob")
它在PostgreSQL和HSQLDB上都能很好地工作!
答案 3 :(得分:-1)
我遇到了smiler错误,原因是我在整数数据类型中有一些除整数以外的字符
例如 - ,111和144-等