无法使用JPA和Sybase ASE存储二进制文件



用户应该能够更改包含byte数组的实体的内容,并将其映射到DB中的image列。请注意,我不能使用LOB功能,因为Sybase不支持它。

当我尝试持久化或合并实体时,只有包含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支持页面只列出错误,不提供进一步的帮助。

我使用的是Sybase ASE 15.7.0, JPA 2优于Hibernate 4.0.1。最后,在Suse 12.2机器上运行JBoss 7.1.1。

实体:

@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部分。

错误的原因是jConnect 7.0版本中的一个错误。我已经更新到7.07,问题已经解决了。

最新更新