загрузка файла шва в столбец postgres bytea «столбец - bytea, но выражение имеет тип bigint» - PullRequest
5 голосов
/ 02 февраля 2012

Точно следуя этому примеру , я загружаю небольшой файл и пытаюсь сохранить его в столбце postgresql bytea.

Вот ошибка (первые два вывода - это операторы регистрации, выводящие атрибуты bean-компонента до попытки INSERT:

SAGE 1 - action.registration.LetterTemplateHome - тип содержимого: текст / xml

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

SAGE 1 - action.registration.LetterTemplateHome - содержимое в виде String: 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.x.x) ',' yu ',' 37078 ',' 202 ') были прерваны. Вызовите getNextException, чтобы увидеть причину.

SAGE 1 - org.hibernate.util.JDBCExceptionReporter - ОШИБКА: столбец "letter_template_text" имеет тип bytea, но выражение имеет тип bigint Подсказка: вам нужно будет переписать или привести выражение. Положение: 162

вот как поле определяется в бине:

    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;
}

Ответы [ 2 ]

4 голосов
/ 02 февраля 2012

Я подозреваю, что Hibernate пытается использовать метод «большого объекта» с PostgreSQL, который включает в себя сохранение «дескриптора» OID для файла в таблице.Некоторые примеры чтения: http://virgo47.wordpress.com/2008/06/13/jpa-postgresql-and-bytea-vs-oid-type/

Если вы хотите придерживаться только использования столбца bytea (а это значительно проще для работы на стороне SQL), используйте BinaryType для сопоставления столбца.См .: правильная аннотация спящего режима для байта []

0 голосов
/ 02 февраля 2012

Это на самом деле не отвечает на ваш вопрос, но я все равно решил поделиться ...

Существует два способа хранения файлов с помощью базы данных, на самом деле: сохранение фактического содержимого файла (как вы делаете) и сохранение только пути к файлу (и сохранение его в реальной файловой системе).

Я работал с обоими методами и предпочел последний по двум причинам: я могу переместить свои файлы на другие жесткие диски, разделы и даже получить к ним доступ через общий ресурс, и все, что мне нужно сделать, это изменить пути к файлам база данных. Кроме того, он делает дампы базы данных (резервные копии) намного меньше и быстрее для выполнения.

...