Невозможно хранить бинарные файлы с JPA и Sybase ASE

Пользователь должен иметь возможность изменять содержимое объекта, который содержит byte массив, сопоставленный с image колонка в БД. Обратите внимание, что я не могу использовать функциональность больших объектов, поскольку Sybase не поддерживает ее.

Когда, когда я пытаюсь сохранить или объединить сущность, только сущности, содержащие text/plain данные хранятся нормально, а файлы других типов, например .pdf или же .odt заставить БД кинуть:

 java.sql.SQLException: JZ0SM: jConnect could not execute a stored procedure because there was a problem sending the parameter(s). This problem was likely caused because the server does not support a specific datatype, or because jConnect did not request support for that datatype at connect time.
Try setting the JCONNECT_VERSION connection property to a higher value. Or, if possible, try sending your procedure execution command as a language statement.

Hibernate записывает нормальное обновление непосредственно перед исключением, и я определенно не выполняю никаких хранимых процедур, поэтому я не уверен, к какой хранимой процедуре относится ошибка. Я пробовал то же самое с нативными запросами, но завершил с той же ошибкой.

16:08:04,776 INFO Hibernate: update KVS_MIPO_DOWNLOAD_FILE set creatorName=?, data=?, referencePeriod=? where id=?

Я проверил версию моего jconn4 водитель и добавил JCONNECT_VERSION=7.0 к моей строке подключения в источнике данных. Нет эффекта.

Поиск в Интернете не принес никаких проблем. На странице поддержки Sybase просто перечислены ошибки и больше не предлагается помощь.

Я использую Sybase ASE 15.7.0, JPA 2 поверх Hibernate 4.0.1.Final, работающий на JBoss 7.1.1 на машине Suse 12.2.

Лицо:

@Entity
@DiscriminatorValue("file")
@Table(name = "KVS_MIPO_DOWNLOAD_FILE")
public class DownloadFile extends DownloadResource {

    @Column(nullable = false)
    private String creatorName;

    @Basic(fetch = FetchType.LAZY)
    private byte[] data = new byte[0];

    private String referencePeriod;

    ...

    public byte[] getData() {
        if (data != null) {
            return data.clone();
        }
        return new byte[0];
    }

    public void setData(final byte[] data) {
        if (data == null) {
            this.data = null;
            return;
        }
        this.data = data.clone();
    }

Стол DDL:

create table KVS_MIPO_DOWNLOAD_FILE (
    referencePeriod           varchar(255)                 null  ,
    creatorName               varchar(255)             not null  ,
    id                        int                      not null  ,
    data                      image                        null   
)

Спасибо.

РЕДАКТИРОВАТЬ: этот вопрос начинался как вопрос JSF/JPA/Sybase. С помощью тестов я могу исключить JSF как источник ошибки, поэтому я удалил части JSF.

1 ответ

Решение

Оказывается, причиной ошибки была ошибка в 7.0 версии jConnect. Я обновил до 7.07, и проблема была решена.

Другие вопросы по тегам