Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сохранение блобов в БД на сервере... 
V
    Опции темы
Swatch
Дата 31.1.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



Добрый день. 

При передачи данных серлету для сохранения в БД на сервере столкнулась с проблемой: данные типа блоб не хотят передаваться. 

вот сеттер/сеттер для блоба:
Код

private byte[] attachment;

public Blob getAttachment() {
        if (this.attachment == null)
            return null;
        else
            return Hibernate.createBlob(this.attachment);
    }

    public void setAttachment(Blob attachment) {
      this.attachment = ByteArray.toByteArray(attachment);
}


вот классик ByteArray, созданный специально для блобов:
Код

public class ByteArray {

    public static byte[] toByteArray(Blob fromImageBlob) {
        if (fromImageBlob != null) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            try {
                return toByteArrayImpl(fromImageBlob, baos);
            } catch (Exception e) {
            }
        }
        return null;
    }

    public static byte[] toByteArrayImpl(Blob fromImageBlob, ByteArrayOutputStream baos) throws SQLException, IOException {
        byte buf[] = new byte[4000];
        int dataSize;
        InputStream is;
        if (fromImageBlob != null)
            is = fromImageBlob.getBinaryStream();
        else 
            return null;
        try {
            while ((dataSize = is.read(buf)) != -1) {
                baos.write(buf, 0, dataSize);
            }
        } finally {
            if (is != null) {
                is.close();
            }
        }
        return baos.toByteArray();
    }
}


данные передаю хмл-ками.
клиент:
Код

public static void setData(IEntity obj) {
        try {
            URL url = new URL("http://localhost:8080/RS_Blog__server_/SaveServlet");
            URLConnection conn = url.openConnection();
            conn.setRequestProperty("Content-Type", "application/x-java-serialized-object");
            conn.setDoOutput(true);
            XMLEncoder e = new XMLEncoder(
                        new BufferedOutputStream(conn.getOutputStream()));
            e.writeObject(obj);            
            e.close();
            conn.getInputStream();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


сервлет:
Код

protected void saveEntity(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        XMLDecoder d = new XMLDecoder(new BufferedInputStream(request.getInputStream()));
        IEntity entity = (IEntity) d.readObject();
        HibernateUtil.Save(entity);
        d.close();
    }


работа с самим изображением и вызов setData с клиента:
Код

try {
                BufferedImage image = ImageIO.read(jFileChooser1.getSelectedFile().getCanonicalFile());
                ByteArrayOutputStream output = new ByteArrayOutputStream();
                ImageIO.write(image, "jpg", output);
                SerialBlob blob;
                try {
                    blob = new SerialBlob(output.toByteArray());
                    if (blob.length() > 5242880){
                        jOptionPane1.showMessageDialog(this,"Too large picture", "Warrning", JOptionPane.ERROR_MESSAGE);
                        return;
                    }
                } catch (SerialException ex) {
                    blob = null;
                } catch (SQLException ex) {
                    blob = null;
                }
                                
                statements st = current_st;
                st.setAttachment(blob);
                ConnectToServer.setData(st);//HibernateUtil.Save(st);
            } catch (IOException ex) {
            }


если пробовать сохранять данные в БД просто на клиенте, не пересылать на сервер, то есть нормально сохраняется... 

кто-нибудь имел дело с передачей блобов на сервер??? в чем может быть дело???
PM MAIL   Вверх
Swatch
Дата 1.2.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



возникла вот такая ошибка:
Код

org.hibernate.exception.GenericJDBCException: could not insert: [com.company.proj.data.statements]
        at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2217)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2610)
        at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:52)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at com.company.proj.database.HibernateUtil.Save(HibernateUtil.java:136)
        at com.company.proj.servlets.SaveServlet.saveEntity(SaveServlet.java:28)
        at com.company.proj.servlets.SaveServlet.doPost(SaveServlet.java:44)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:619)
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint "INTEG_15" on table "STATEMENTS"
        at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:712)
        at org.firebirdsql.jdbc.AbstractPreparedStatement.executeUpdate(AbstractPreparedStatement.java:172)
        at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2197)
        ... 29 more


Может быть кто-нибудь сталкивался с таким или знает, почему такая ошибка может возникнуть???
PM MAIL   Вверх
necromancer
Дата 1.2.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



а при чем тут блобы?
тебе фиреберд прямо так по ангельски и пишет, что вставка не возможна, по причине того что такой уникальный ключ для записи уже есть. даже показывает в какой таблице и какойстолбец!
 Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint "INTEG_15" on table "STATEMENTS"

Насчет записи блобов для каждой БД решение свое. Вот мое для Оракла:
Код

    @Column (name="img")
    @Type(type = "org.hibernate.type.PrimitiveByteArrayBlobType")
    private byte[] img;

    public byte[] getImg() {
        return img;
    }

    public void setImg(byte[] img) {
        this.img = img;
    }


больше никаких особенностей. Но повторюсь это для Оракла.

Это сообщение отредактировал(а) necromancer - 1.2.2008, 12:28


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
Swatch
Дата 1.2.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



вот ошибка, которая появляется при попытке сохранить блоб:
Код

java.lang.InstantiationException: org.hibernate.lob.SerializableBlob
Continuing ...
java.lang.RuntimeException: failed to evaluate: <unbound>=Class.new();
Continuing ...


Добавлено через 10 минут и 58 секунд
действительно, Вы были правы, necromancer... сделала так, как Вы написали.. заработало!!! Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0444 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.