用户应该能够更改包含byte
数组的实体的内容,该数组映射到image
数据库中的列。请注意,我不能使用 LOB 功能,因为 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 支持页面只是列出了错误并且不提供进一步的帮助。
我在 Hibernate 4.0.1.Final 上使用 Sybase ASE 15.7.0、JPA 2,在 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 部分。