seam file upload to postgres bytea column “ column is bytea but expression is of type bigint”

风流意气都作罢 提交于 2019-12-07 01:49:16

问题


Closely following this example, I'm uploading a small file and trying to store into postgresql bytea column.

Here is error (first two outputs are logging statements outputting attributes of bean before the INSERT is attempted:

SAGE 1 -- action.registration.LetterTemplateHome - content type: text/xml

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

SAGE 1 -- action.registration.LetterTemplateHome - contents as String: xml version="1.0" encoding="UTF-8" standalone="yes" .... etc

SAGE 1 -- org.hibernate.util.JDBCExceptionReporter - Batch entry 0 insert into letter_template (content_type, file_name_template, fileSize, letter_template_name, letter_template_text, letter_template_id) values ('text/xml', 'letterDate.xml', '0', 'yu', '37078', '202') was aborted. Call getNextException to see the cause.

SAGE 1 -- org.hibernate.util.JDBCExceptionReporter - ERROR: column "letter_template_text" is of type bytea but expression is of type bigint Hint: You will need to rewrite or cast the expression. Position: 162

here is how the field is defined in the 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;
}

回答1:


I suspect that Hibernate is trying to use the "large object" method with PostgreSQL, which involves storing an OID "handle" to the file in the table. Some example reading: http://virgo47.wordpress.com/2008/06/13/jpa-postgresql-and-bytea-vs-oid-type/

If you want to stick with just using a bytea column (and this is considerably simpler to work with on the SQL side), use BinaryType to map the column. See: proper hibernate annotation for byte[]




回答2:


The similar error may appear if you fave <loadData/> with missed column tags inside and some csv file, with, say, path to blob files in some csv column used for populating blobs column in the table. It doesn't point to "wow, you don't have columns there in loadData tag", but assume all the csv columns are string data and then throws the said error (but writes column is bytea but expression is of type string). You just need to specify all columns of the table explicitly with column tags and provide their data type.




回答3:


This doesn't really answer your question, but I thought I'd share anyway...

There are two ways of storing files with the help of a database, really: storing the actual contents of the file (like you're doing) and storing only the file path (and saving it in the actual filesystem).

I've worked with both methods and I preferred the latter for two reasons: I can move my files around to other hard drives, partitions and even access them through a share and all I need to do is change the file paths in the database. Also, it makes database dumps (aka backups) a lot smaller and faster to perform.



来源:https://stackoverflow.com/questions/9114510/seam-file-upload-to-postgres-bytea-column-column-is-bytea-but-expression-is-of

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!