Hibernate Spring,Blob下载,字节[]大小增加两倍
我将Spring3.0与Hibernate和PostgreSQL一起使用,我有以下问题:Hibernate Spring,Blob下载,字节[]大小增加两倍,hibernate,spring,postgresql,bytearray,blob,Hibernate,Spring,Postgresql,Bytearray,Blob,我将Spring3.0与Hibernate和PostgreSQL一起使用,我有以下问题: 我将文件上传到数据库,保存其内容类型,一切正常,数据库中字段的大小正常。然而,当我尝试下载它时,Hibernate返回的字节数组是它应该返回的字节数组的两倍大。下载的文件当然已损坏。该大小是数据库中大小的2倍。。。我的代码如下所示: 字段域类(带映射): 加载对象的DAO函数: public Candidate load(Integer id) { return (Candidate) getHiber
我将文件上传到数据库,保存其内容类型,一切正常,数据库中字段的大小正常。然而,当我尝试下载它时,Hibernate返回的字节数组是它应该返回的字节数组的两倍大。下载的文件当然已损坏。该大小是数据库中大小的2倍。。。我的代码如下所示:
字段域类(带映射): 加载对象的DAO函数:
public Candidate load(Integer id) {
return (Candidate) getHibernateTemplate().get(Candidate.class, id);
}
会话工厂配置:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.jdbc.batch_size">30</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="packagesToScan" value="foo.foo.core.domain"/>
</bean>
数据库编码为UTF-8(如果有任何区别)。我尝试使用org.springframework.jdbc.support.lob.DefaultLobHandler,但它没有做到这一点。。有什么想法吗?这让我发疯。我也遇到了同样的问题,但仍然不知道如何解决它,但这肯定是一个编目问题。 我将两个图像都保存在磁盘上,错误的一个是为原始代码的字符表示设置十六进制代码,即 原始图像以以下字节开始(十六进制表示): FF D8 FF E0 重新加载的字节数组(双大小)如下所示: 6666643866666530
这恰好是“ff d8 ff e0”的十六进制编码,因为字符(f=66HEX)找到了解决方案,请按如下方式更改bytea输出的DB设置: 通过tea_output='escape'更改数据库设置
Oscar.您确定Hibernate返回了错误的数组,并且不是之后某些转换的结果吗?如果这解决了您的问题,您还可以通过将JDBC驱动程序更新到9.0-801版本来解决。该版本支持Postgresql 9.0,默认情况下bytea转义格式更改为“十六进制”(效率更高),这正是导致问题的原因。我不知道他们为什么默认使用十六进制…可变长度bytea转义格式实际上是获取大值的性能瓶颈(因为服务器必须在内部不断重新分配缓冲区iirc),这尤其影响到pg_dump等工具。他们认为主要的版本升级是引入一些不向后兼容的功能的合理时间。这听起来对我来说是可行的!但是我不知道如何运行这个命令!好的,使用由tea\u output='escape'设置的ALTER数据库“MyDbName”进行操作——谢谢奥斯卡!
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.jdbc.batch_size">30</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="packagesToScan" value="foo.foo.core.domain"/>
</bean>
CREATE TABLE candidate
(
id serial NOT NULL,
cv bytea,
...
)