补充一下,提示的异常信息为:
javax.servlet.ServletException: could not insert: [michael.Photo]
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause org.hibernate.exception.SQLGrammarException: could not insert: [michael.Photo]
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:1986)
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2405)
org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:37)
org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:269)
org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:167)
org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:98)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:502)
org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:494)
org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:490)
michael.PhotoDao.addPhoto(PhotoDao.java:24)
michael.IndexAction.execute(IndexAction.java:58)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

解决方案 »

  1.   

    <html:form   action="/index"   enctype="multipart/form-data">   
    里加上
    <html:form   action="/index"   enctype="multipart/form-data" method="post"> ??   
      

  2.   

    对了,你数据库设置的字段类型是不是 longblob ??
      

  3.   

    设置成longblob还是不行,这次不用web方式了。
    public class Test {
    public static void main(String[] args)throws Exception {
    Configuration config = new Configuration().configure();
    SessionFactory factory = config.buildSessionFactory();
    Session session = factory.openSession();

    BufferedInputStream bis = new BufferedInputStream(
    new FileInputStream("C:\\test.jpg"));
    //byte[] buf = new byte[bis.available()];
    Blob b = Hibernate.createBlob(bis);

    Tuser t = new Tuser();
    t.setName("Michael");
    t.setPhoto(b);

    Transaction tx = session.beginTransaction();
    session.saveOrUpdate(t);
    tx.commit();
    }}配置文件:
    <hibernate-mapping>
        <class name="blob.Tuser" table="tuser" catalog="test">
            <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="native" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" length="20" not-null="true" />
            </property>
            <property name="photo" type="java.sql.Blob">
                <column name="photo" />
            </property>
        </class>
    </hibernate-mapping>如果把改成:
            <property name="photo" type="binary">
                <column name="photo" />
            </property>
    这样可以插进去,但是读取后图片却无法显示了。报告异常如下:
    Hibernate: insert into test.tuser (name, photo) values (?, ?)
    Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not insert: [blob.Tuser]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:1986)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2405)
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:37)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:269)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:167)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:98)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:502)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:494)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:490)
    at blob.Test.main(Test.java:31)
      

  4.   

    数据太大你就该用CLOB类型啊!
      

  5.   

    org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67) 
    映射文件有问题
      

  6.   

    兄弟们:大对象是不可以直接插入的。
    1,要先保存一个空的 Blob 对象 
    2。锁定这条记录 。再更新。    
            try {
                ..........
                byte[] buf = photo.getFileData();
                Blob blob = Hibernate.createBlob("");
                p.setPhoto(blob);            session.save(p);
                 session.flush();
                 //锁定记录
                 session.refresh(p,LockMode.UPDATA);
                Blob temp =  p.getPhoto();
                InputStream is  = temp.getBinaryStream();
    is.read(buf);
                is.close();
                transacation.commit();

                这里我就不跳到 DAO里去了。
                //PhotoDao dao = new PhotoDao();
               // dao.addPhoto(p);
                
                //dao.closeSession();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
      

  7.   

    我建议:照片存储的方法:应该把照片或图片保存到一个指定的文件夹目录中(当然,这个目录最好是安全的,如:/WEB-INF/.....),然后将其路径保存到数据库中.这样就可以避免很多问题了.