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

问题描述 投票:0回答:6

紧接着这个示例,我正在上传一个小文件并尝试存储到 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”...等

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;
}
postgresql seam
6个回答
13
投票

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

bytea

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

//and get and set

7
投票

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

如果您想坚持只使用 bytea 列(这在 SQL 端使用起来要简单得多),请使用 BinaryType 来映射列。请参阅:byte[] 的正确休眠注释


4
投票
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;

1
投票

如果您喜欢

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


0
投票

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

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

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


0
投票

将表模式中的列类型从 bytea 更改为 oid。

© www.soinside.com 2019 - 2024. All rights reserved.