2013-04-09 3 views
0

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

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

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 просто перечисляет erorr и не предлагает никакой дополнительной помощи.

Я использую Sybase ASE 15.7.0, JPA 2 over 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 
) 

Спасибо.

EDIT: этот вопрос начался как вопрос JSF/JPA/Sybase. Через тесты я могу исключить JSF в качестве источника ошибки, поэтому я удалил части JSF.

ответ

1

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