【问题标题】:seam file upload to postgres bytea column " column is bytea but expression is of type bigint"seam 文件上传到 postgres bytea 列“列是 bytea 但表达式是 bigint 类型”
【发布时间】:2012-02-25 05:40:09
【问题描述】:

紧跟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" .... 等

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的评论。就在文件系统中存储上传的文件而言,我们的环境被锁定。我必须有一个非常好的理由才能产生差异。此外,我们有负载平衡器,它们可以很好地处理数据库更改。我不确定他们将如何处理文件系统文件。有问题的数据量非常小,不会影响性能。而且,我认为在 db 和文件系统之间创建这种链接确实会变得非常脆弱。
    【解决方案2】:

    我怀疑 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[]

    【讨论】:

    • 谢谢。您的第一个链接肯定描述了问题。然而,当我使用不同版本的 postgresql(和不同的驱动程序)时,问题就消失了。我将发布一张图表,说明哪些驱动程序/哪些 postgresql 版本/哪些注释可以一起工作。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:
        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;
        

        【讨论】:

          猜你喜欢
          • 2023-02-09
          • 2020-06-08
          • 2015-01-01
          • 2023-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-19
          • 2018-12-31
          相关资源
          最近更新 更多