Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate Spring,Blob下载,字节[]大小增加两倍_Hibernate_Spring_Postgresql_Bytearray_Blob - Fatal编程技术网

Hibernate Spring,Blob下载,字节[]大小增加两倍

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

我将Spring3.0与Hibernate和PostgreSQL一起使用,我有以下问题:
我将文件上传到数据库,保存其内容类型,一切正常,数据库中字段的大小正常。然而,当我尝试下载它时,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,
  ...
)