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

mcg*_*er5 6 postgresql seam

紧跟这个例子,我正在上传一个小文件并尝试存储到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;
}
Run Code Online (Sandbox Code Playgroud)

小智 6

对我来说,它正在处理byteaPostgres 数据库中的类型。

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

//and get and set
Run Code Online (Sandbox Code Playgroud)


ara*_*nid 5

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

如果您只想使用bytea列(这在SQL端使用起来要简单得多),请使用BinaryType映射该列。请参阅:为字节[]设置适当的休眠注释


And*_*dre 0

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

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

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

  • 谢谢你的评论。我们的环境在文件系统中存储上传的文件时被锁定。我必须有一个非常充分的理由来提出差异。此外,我们还有负载均衡器,它们可以很好地处理数据库更改。我不确定他们如何处理文件系统文件。所涉及的数据量非常小,不会影响性能。而且,我认为在数据库和文件系统之间创建这种链接确实非常脆弱。 (2认同)