【问题标题】:error using blob with hibernate 4, spring, mysql将blob与hibernate 4,spring,mysql一起使用时出错
【发布时间】:2013-12-06 19:25:11
【问题描述】:

我正在开发 this tutorial,但必须升级到 hibernate 4 作为一些更改的一部分,以使其与更现代的工具一起使用。

当我尝试在 hibernate 4 和 spring 中对 MySQL 数据库执行 blob 操作时,有人可以告诉我如何解决引发的错误吗?

目前,以下代码行正在触发错误:

session.save(document); //line 23

这是代码行所在的方法:

@Transactional
public void save(Document document) {
   Session session = sessionFactory.getCurrentSession();
   session.save(document); //line 23
}

这是包含该方法的类:

@Repository
public class DocumentDAO {

    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    public void save(Document document) {
        Session session = sessionFactory.getCurrentSession();
        session.save(document); //line 23
    }

    @Transactional
    public List<Document> list() {
       Session session = sessionFactory.getCurrentSession();
       List<Document> documents = null;
       try {documents = (List<Document>)session.createQuery("from Document").list();} 
       catch (HibernateException e) {e.printStackTrace();}
       return documents;
    }

    @Transactional
    public Document get(Integer id) {
       Session session = sessionFactory.getCurrentSession();
       return (Document)session.get(Document.class, id);
    }

   @Transactional
   public void remove(Integer id) {
       Session session = sessionFactory.getCurrentSession();
       Document document = (Document)session.get(Document.class, id);
       session.delete(document);
   }
}

这里是被抛出的异常:

HTTP Status 500 - Handler processing failed; nested exception is java.lang.AbstractMethodError: org.apache.commons.dbcp.DelegatingPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V

type Exception report

message Handler processing failed; nested exception is java.lang.AbstractMethodError: org.apache.commons.dbcp.DelegatingPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V

description The server encountered an internal error that prevented it from fulfilling this request.

exception 

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.AbstractMethodError: org.apache.commons.dbcp.DelegatingPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V
org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWithError(DispatcherServlet.java:1259)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

root cause 

java.lang.AbstractMethodError: org.apache.commons.dbcp.DelegatingPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V
org.hibernate.type.descriptor.sql.BlobTypeDescriptor$5$1.doBind(BlobTypeDescriptor.java:133)
org.hibernate.type.descriptor.sql.BlobTypeDescriptor$2$1.doBind(BlobTypeDescriptor.java:90)
org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:93)
org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280)
org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:275)
org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:57)
org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2786)
org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2761)
org.hibernate.persister.entity.AbstractEntityPersister$4.bindValues(AbstractEntityPersister.java:2968)
org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2975)
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3487)
org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)
org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:214)
org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:194)
org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:178)
org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:321)
org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:286)
org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192)
org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206)
org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:191)
org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764)
org.hibernate.internal.SessionImpl.save(SessionImpl.java:756)
org.hibernate.internal.SessionImpl.save(SessionImpl.java:752)
net.viralpatel.docmanager.dao.DocumentDAO.save(DocumentDAO.java:23)
net.viralpatel.docmanager.dao.DocumentDAO$$FastClassByCGLIB$$21ec305f.invoke(<generated>)
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
net.viralpatel.docmanager.dao.DocumentDAO$$EnhancerByCGLIB$$3c5ce7aa.save(<generated>)
net.viralpatel.docmanager.controller.DocumentController.save(DocumentController.java:86)
net.viralpatel.docmanager.controller.DocumentController$$FastClassByCGLIB$$5615142d.invoke(<generated>)
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
net.viralpatel.docmanager.controller.DocumentController$$EnhancerByCGLIB$$1edfcfb8.save(<generated>)
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.invokeHandlerMethod(HandlerMethodInvoker.java:176)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)  

这里是hibernate.cfg.xml:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
<hibernate-configuration>
    <session-factory>
        <mapping class="net.viralpatel.docmanager.model.Document" />
    </session-factory>

</hibernate-configuration>  

这里是 Document 类:

@Entity
@Table(name="documents")
public class Document {

    @Id
    @GeneratedValue
    @Column(name="id")
    private Integer id;

    @Column(name="name")
    private String name;

    @Column(name="description")
    private String description;

    @Column(name="filename")
    private String filename;

    @Column(name="content")
    @Lob
    private Blob content;

    @Column(name="content_type")
    private String contentType;

    @Column(name="created")
    private Date created;

    //Getter and Setter methods
    public Blob getContent(){return content;}
    public String getContentType(){return contentType;}
    public String getDescription(){return description;}
    public String getFileName(){return filename;}
    public String getName(){return name;}

    public void setContent(Blob ct){content=ct;}
    public void setContentType(String ctype){contentType=ctype;}
    public void setDescription(String desc){description=desc;}
    public void setFileName(String fn){filename=fn;}
    public void setName(String nm){name=nm;}
}

jdbc.properties 是:

jdbc.driverClassName= com.mysql.jdbc.Driver
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.databaseurl=jdbc:mysql://localhost:3306/docbd
jdbc.username=user
jdbc.password=pwd  

pom.xml 的相关部分包括:

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.10</version>
</dependency>
<dependency>
  <groupId>commons-dbcp</groupId>
  <artifactId>commons-dbcp</artifactId>
  <version>20030825.184428</version>
</dependency>
<dependency>
  <groupId>commons-pool</groupId>
  <artifactId>commons-pool</artifactId>
  <version>1.5.4</version>
</dependency>
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.2.1</version>
</dependency>
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>1.3</version>
</dependency>

【问题讨论】:

  • 你能展示你的实体和你的数据源/连接和休眠配置吗?
  • 我的意思是你的 Document 类
  • 另外,您使用的是哪个版本的 apache 数据库连接池,您确定这是完整的堆栈吗?
  • 我的意思是你的 hibernate.cfg.xml 或者你配置数据库连接细节的地方。
  • @Taylor 我添加了一些东西。他们是你要找的吗?我还有一个 jdbc.properties 文件,它为 5 个 jdbc 属性设置值,并从我的应用程序上下文 xml 中调用。你看到我的 hibernate.cfg.xml 引用了 hibernate 3 吗?那是错误吗?如果是这样,我该如何解决?

标签: java mysql spring hibernate spring-mvc


【解决方案1】:

问题似乎是 apache dbcp 的过时版本。在您的 pom.xml 中将其更新为 1.4 或更高版本,您应该一切顺利。

【讨论】:

  • 谢谢。我在上面发布的 pom.xml 中的其他项目呢?
  • 我将 commons-dbcp 版本更改为 1.4,删除了我的 .m2 文件夹,然后强制执行 maven 更新以创建一个新的 .m2 文件夹。现在有两个构建路径错误,一个与 hibernate-core-4.2.6.Final.jar 相关,另一个与 servlet-api-2.5.jar 相关,这两个错误都确实位于 .m2 文件夹中的正确位置。我认为当 pom.xml 中看似无关的事情发生变化时,maven 会把事情搞混。你有解决这个问题的建议吗?这是一个相关链接:stackoverflow.com/questions/20101876/…
  • 您无需删除 .m2 文件夹。不确定您的构建路径错误来自什么,您是否使用自定义 maven settings.xml 您将删除它并需要替换它。您遇到了哪些构建路径错误?
  • +1 并感谢答案。感谢您的所有耐心帮助。奇怪的是,昨晚关闭我的机器并在今天早上重新启动它会自动触发构建路径错误的实际解决方案。您的 dbcp 升级建议是解决本文开头的问题的原因。至于删除.m2,我一般先做个备份。再次感谢您。
猜你喜欢
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 2015-07-07
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2020-01-28
相关资源
最近更新 更多