Seam文件上传到Postgres bytea专栏" column is bytea but expression is of type bigint"



紧跟这个例子,我上传了一个小文件,并试图存储到postgresql字节列中。

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

SAGE 1-action.registration.LetterTemplate主页-内容类型:text/xml

SAGE 1-action.registration.LetterTemplate主页-letterTemplate文本:[B@48c7aaef

SAGE 1-action.registration.LetterTemplateHome-内容为String:xml version="1.0"encoding="UTF-8"standalone="yes"。。。。etc

SAGE 1--org.hibernate.util.JDBCException Reporter-批次条目0插入letter_template(content_type、file_name_template、fileSize、letter_tmplate_name、letter_Tmplate_text、letter-tmplate_id)值('text/xml'、'letterDate.xml'、'0'、'yu'、'37078'、'202')已中止。调用getNextException查看原因。

SAGE 1--org.hibernate.util.JDBCException Reporter-错误:列"letter_template_text"的类型为byta,但表达式的类型为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;
}

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

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

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

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

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;

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

这并不能真正回答你的问题,但我想我无论如何都会分享。。。

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

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

相关内容

最新更新