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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение блоба в бд с помощью hibernate 
V
    Опции темы
GrayLink
Дата 19.1.2010, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток, я пытаюсь сохранить файл в MySQL используя блоб хибернейта. Но в результате всегда получаю 

Код

java.lang.UnsupportedOperationException: Blob may not be manipulated from creating session
    org.hibernate.lob.BlobImpl.excep(BlobImpl.java:127)
    org.hibernate.lob.BlobImpl.getBytes(BlobImpl.java:73)
    org.hibernate.lob.SerializableBlob.getBytes(SerializableBlob.java:58)
    com.mysql.jdbc.PreparedStatement.setBlob(PreparedStatement.java:2845)
    org.apache.commons.dbcp.DelegatingPreparedStatement.setBlob(DelegatingPreparedStatement.java:181)
    com.uni.domain.FileType.nullSafeSet(FileType.java:37)
    org.hibernate.type.CustomType.nullSafeSet(CustomType.java:169)
    org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2025)
    org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2002)
    org.hibernate.persister.entity.AbstractEntityPersister$3.bindValues(AbstractEntityPersister.java:2180)
    org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:56)
    org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2186)
    org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2666)
    org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
    org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
    org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
    org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
    org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:562)
    org.hibernate.impl.SessionImpl.save(SessionImpl.java:550)
    org.hibernate.impl.SessionImpl.save(SessionImpl.java:546)
    com.uni.db.GenericDaoImpl.save(GenericDaoImpl.java:38)
    com.uni.db.GenericServiceImpl.save(GenericServiceImpl.java:25)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    $Proxy6.save(Unknown Source)
    com.uni.controllers.UserEdit.processSubmit(UserEdit.java:91)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:421)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:136)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:326)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:313)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.tuckey.web.filters.urlrewrite.RewrittenUrl.doRewrite(RewrittenUrl.java:176)
    org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:728)
    com.uni.filters.AuthGuard.doFilter(AuthGuard.java:30)
    com.uni.filters.EncodingFilter.doFilter(EncodingFilter.java:21)


Вот код описания типа

Код

package com.uni.domain;


import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;

import java.io.Serializable;
import java.sql.*;
import java.util.Arrays;

public class FileType implements UserType {
    
    public int[] sqlTypes() {
        return new int[]{Types.BLOB};
    }

    public Class returnedClass() {
        return byte[].class;
    }

    public boolean equals(Object o, Object o1) throws HibernateException {
        return Arrays.equals((byte[]) o, (byte[]) o1);
    }

    public int hashCode(Object o) throws HibernateException {
        return o.hashCode();
    }

    public Object nullSafeGet(ResultSet resultSet, String[] strings, Object o) throws HibernateException, SQLException {
        Blob blob = resultSet.getBlob(strings[0]);
        return blob.getBytes(1, (int) blob.length());
    }

    public void nullSafeSet(PreparedStatement st, Object value, int index)
            throws HibernateException, SQLException {
        st.setBlob(index, Hibernate.createBlob((byte[]) value));
    }

    public Object deepCopy(Object value) {
        if (value == null) return null;

        byte[] bytes = (byte[]) value;
        byte[] result = new byte[bytes.length];
        System.arraycopy(bytes, 0, result, 0, bytes.length);

        return result;
    }

    public boolean isMutable() {
        return true;
    }

    public Serializable disassemble(Object o) throws HibernateException {
        return null;
    }

    public Object assemble(Serializable serializable, Object o) throws HibernateException {
        return null;
    }

    public Object replace(Object o, Object o1, Object o2) throws HibernateException {
        return null;
    }
}


Меппинг

Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.uni.domain">
    <class name="com.uni.domain.File">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="data" type="com.uni.domain.FileType"/>
        <property name="contentType"/>
    </class>

</hibernate-mapping>


Сам POJO

Код

package com.uni.domain;

public class File extends Identifier {

    private byte[] data;
    private String contentType;

    public byte[] getData() {
        return data;
    }

    public File() {}

    public void setData(byte[] photo) {
        this.data = photo;
    }

    public boolean isNew() {
        return true;
    }

    public String getContentType() {
        return contentType;
    }

    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

}


Что я делаю не так?

Это сообщение отредактировал(а) GrayLink - 19.1.2010, 01:20
PM MAIL   Вверх
jk1
Дата 19.1.2010, 00:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Где же сам сохраняющий код? Выглядит так, как будто сохранение идет мимо сессии Hibernate, чего быть не должно.

Это сообщение отредактировал(а) jk1 - 19.1.2010, 00:51


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
GrayLink
Дата 19.1.2010, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сохраняющий код:

Код

@Autowired
private SessionFactory sessionFactory;

public Session getSession() {
        return sessionFactory.getCurrentSession();
}

public void save(Identifiable entity) {
        if (entity.isNew()) {
            getSession().saveOrUpdate(entity);
        } else {
            Object merged = getSession().merge(entity);
            getSession().saveOrUpdate(merged);
        }
    }



В данном случае объект новый и работает getSession().saveOrUpdate(entity);

Это сообщение отредактировал(а) GrayLink - 19.1.2010, 01:21
PM MAIL   Вверх
dobrolub
Дата 19.1.2010, 01:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



разговор кодом smile
Код

  public void nullSafeSet(PreparedStatement st, Object value, int index)
            throws HibernateException, SQLException {
        //st.setBlob(index, Hibernate.createBlob((byte[]) value));
           st.setBlob(index, new java.io.ByteArrayInputStream((byte []) value));
    }


Это сообщение отредактировал(а) dobrolub - 19.1.2010, 01:24
PM   Вверх
GrayLink
Дата 19.1.2010, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не работает  smile 

Код

java.lang.AbstractMethodError: org.apache.commons.dbcp.DelegatingPreparedStatement.setBlob(ILjava/io/InputStream;)V
    com.uni.domain.FileType.nullSafeSet(FileType.java:42)
    org.hibernate.type.CustomType.nullSafeSet(CustomType.java:169)
    org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2025)
    org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2002)
    org.hibernate.persister.entity.AbstractEntityPersister$3.bindValues(AbstractEntityPersister.java:2180)
    org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:56)
    org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2186)
    org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2666)
    org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
    org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
    org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
    org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
    org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:534)
    org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:526)
    org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:522)
    com.uni.db.GenericDaoImpl.save(GenericDaoImpl.java:38)
    com.uni.db.GenericServiceImpl.save(GenericServiceImpl.java:25)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    $Proxy6.save(Unknown Source)
    com.uni.controllers.UserEdit.processSubmit(UserEdit.java:91)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:421)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:136)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:326)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:313)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.tuckey.web.filters.urlrewrite.RewrittenUrl.doRewrite(RewrittenUrl.java:176)
    org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:728)
    com.uni.filters.AuthGuard.doFilter(AuthGuard.java:30)
    com.uni.filters.EncodingFilter.doFilter(EncodingFilter.java:21)


PM MAIL   Вверх
jk1
Дата 19.1.2010, 08:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Что я делаю не так?

Вы пытаетесь сохранять Blob не в той сессии, в которой он был создан. Этого Hibernate вам не позволит. Самый простой workaround - хранить данные в виде bte[] и преобразовывать в Blob и обратно непосредственно при сохранении/чтении. 


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
GrayLink
Дата 19.1.2010, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

Вы пытаетесь сохранять Blob не в той сессии, в которой он был создан. Этого Hibernate вам не позволит. Самый простой workaround - хранить данные в виде bte[] и преобразовывать в Blob и обратно непосредственно при сохранении/чтении.

Не очень понял вас, он и так создается непосредственно при сохранении, FileType - служебный класс для хибернейта, он описывает как сохранять файл.
PM MAIL   Вверх
dobrolub
Дата 19.1.2010, 08:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



Последняя попытка smile

Код

   public void nullSafeSet(PreparedStatement st, Object value, int index)
            throws HibernateException, SQLException {
      org.apache.commons.dbcp.DelegatingPreparedStatement ps =
         (org.apache.commons.dbcp.DelegatingPreparedStatement) st;
       
      PreparedStatement nativePs = (PreparedStatement)ps.getInnermostDelegate();
      nativePs.setBlob(index, new java.io.ByteArrayInputStream((byte []) value));
   }


Это сообщение отредактировал(а) dobrolub - 19.1.2010, 09:04
PM   Вверх
GrayLink
Дата 19.1.2010, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



dobrolub, большое спасибо, помогло  smile 
PM MAIL   Вверх
dobrolub
Дата 19.1.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



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

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

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


 




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


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

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