接缝文件上传到postgres bytea列“列是bytea但表达式是bigint类型”

时间:2012-02-02 14:59:26

标签: postgresql seam

紧跟this example之后,我正在上传一个小文件并尝试存储到postgresql bytea列中。

这是错误(前两个输出是在尝试INSERT之前输出bean属性的日志语句:

  

SAGE 1 - action.registration.LetterTemplateHome - 内容类型:text / xml

     

SAGE 1 - action.registration.LetterTemplateHome - letterTemplateText:[B @ 48c7aaef

     

SAGE 1 - action.registration.LetterTemplateHome - 内容为字符串:xml version =“1.0”encoding =“UTF-8”standalone =“yes”.... etc

     

SAGE 1 - org.hibernate.util.JDBCExceptionReporter - 批量输入0插入letter_template(content_type,file_name_template,fileSize,letter_template_name,letter_template_text,letter_template_id)值('text / xml','letterDate.xml','0 ','yu','37078','202')被中止。调用getNextException以查看原因。

     

SAGE 1 - org.hibernate.util.JDBCExceptionReporter - 错误:列“letter_template_text”的类型为bytea,但表达式的类型为bigint     提示:您需要重写或转换表达式。     位置:162

这里是如何在bean中定义字段:

    private byte[] letterTemplateText;

@Lob
@Column(name = "letter_template_text")
@Basic(fetch = FetchType.LAZY)
public byte[] getLetterTemplateText() {
    return this.letterTemplateText;
}

public void setLetterTemplateText(byte[] letterTemplateText) {
    this.letterTemplateText = letterTemplateText;
}

5 个答案:

答案 0 :(得分:4)

我怀疑Hibernate正在尝试使用PostgreSQL的“大对象”方法,该方法涉及将OID“句柄”存储到表中的文件中。一些示例阅读:http://virgo47.wordpress.com/2008/06/13/jpa-postgresql-and-bytea-vs-oid-type/

如果您想坚持使用bytea列(这在SQL端使用起来相当简单),请使用BinaryType映射列。请参阅:proper hibernate annotation for byte[]

答案 1 :(得分:3)

对我来说,它正在Postgres数据库中使用类型bytea

@Lob
@Type(type="org.hibernate.type.BinaryType")
@Column(name = "photo")
private byte[] photo;

//and get and set

答案 2 :(得分:1)

如果您在<loadData/>里面缺少column标签和某些csv文件,例如在某些csv列中的blob文件路径用于填充表中的blob列,则可能会出现类似的错误。它不是指向“哇,在loadData标记中没有列”,而是假定所有的csv列都是字符串数据,然后抛出该错误(但写入column is bytea but expression is of type string)。您只需要使用column标签显式指定表的所有列并提供其数据类型即可。

答案 3 :(得分:0)

这并没有真正回答你的问题,但无论如何我还是想分享......

有两种方法可以在数据库的帮助下存储文件,实际上:存储文件的实际内容(就像你正在做的那样)并只存储文件路径(并将其保存在实际的文件系统中)

我使用过这两种方法,我更喜欢后者有两个原因:我可以将文件移动到其他硬盘,分区甚至通过共享访问它们,我需要做的就是更改文件数据库中的路径。此外,它使数据库转储(也称为备份)的执行速度更小,速度更快。

答案 4 :(得分:0)

change @Lob annotation with @Table 



   instead of this ; 
    **@Lob**
    @Column(name = "letter_template_text")
    @Basic(fetch = FetchType.LAZY)
    private byte[] icon;

    write ;
    
    **@Type(type="org.hibernate.type.BinaryType")**
    @Column(name = "letter_template_text")
    @Basic(fetch = FetchType.LAZY)
    private byte[] icon;