Spring, Blob скачать, размер байта [] увеличивается в два раза - PullRequest
5 голосов
/ 21 февраля 2011

Я использую Spring 3.0 с Hibernate и PostgreSQL, и у меня возникает следующая проблема:
Я загружаю файлы в базу данных, сохраняя ее тип контента, и все работает нормально, размер поля в базе данных в порядке,Однако когда я пытаюсь загрузить его, Hibernate возвращает байтовый массив в два раза больше, чем должен.Загруженные файлы повреждены, конечно.Размер в два раза больше размера в базе данных ... Мой код выглядит следующим образом:
Класс домена области (с отображением):

private byte[] cv;

@Column(name="cv")
public byte[] getCv() {
  return this.cv;
}

Функция 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>

SQL Create:

CREATE TABLE candidate
(
  id serial NOT NULL,
  cv bytea,
  ...
)

База данных имеет кодировку UTF-8, если это имеет значение.
Я пытался с org.springframework.jdbc.support.lob.DefaultLobHandler, но он ничего не делает .. Есть идеи?Это сводит меня с ума ..

Ответы [ 2 ]

4 голосов
/ 03 марта 2011

нашел решение, измените настройки БД для вывода байтов следующим образом:

ALTER DATABASE SET bytea_output = 'escape';

Оскар.

0 голосов
/ 03 марта 2011

У меня та же проблема, и я до сих пор не знаю, как ее решить, но это точно проблема кодификации. Я сохранил оба изображения на диске, и неправильное - установка шестнадцатеричных кодов для представления символов оригинала, то есть

Исходное изображение начинается со следующих байтов (шестнадцатеричное представление):

FF D8 FF E0 ...

Восстановленный байтовый массив (двойной размер) выглядит следующим образом:

66 66 64 38 66 66 65 30 ...

Что является шестнадцатеричной кодификацией "ff d8 ff e0" в виде символов (f = 66HEX)

...