我在一个hibernate中用到了blob类型字段(oracle9),现在出现下面的异常,google一下以后说是要将对blob的操作放入事务中,但不知道具体如何实施,请大家帮忙,谢谢!
2006-04-18 14:14:17,827 [com.opensymphony.webwork.dispatcher.ServletDispatcher]-[ERROR] Could not execute action
java.lang.IllegalStateException: Active Spring transaction synchronization or active JTA transaction with 'jtaTransactionManager' on LocalSessionFactoryBean required
at org.springframework.orm.hibernate3.support.AbstractLobType.nullSafeSet(AbstractLobType.java:218)
at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:145)
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:1826)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2172)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2118)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2374)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:84)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1009)
at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:394)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:817)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:809)
at com.cs2c.oa2.dao.hibernate.ReceiveMailHibernate.getInnermailByMailid(ReceiveMailHibernate.java:61)
at com.cs2c.oa2.service.impl.ReceiveMailServiceImp.getInnermailByMailid(ReceiveMailServiceImp.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:335)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:165)
at $Proxy2.getInnermailByMailid(Unknown Source)
at com.cs2c.oa2.action.mail.ReadMailAction.execute(ReadMailAction.java:27)

解决方案 »

  1.   

    /**
        * 向数据库中插入一个新的BLOB对象
        *
        * @param infile - 数据文件
        * @throws java.lang.Exception
        * @roseuid 3EDA04E300F6
        */
       public static void blobInsert(String infile) throws Exception
       {
           /* 设定不自动提交 */
           boolean defaultCommit = conn.getAutoCommit();
           conn.setAutoCommit(false);       try {
               /* 插入一个空的BLOB对象 */
               stmt.executeUpdate("INSERT INTO TEST_BLOB VALUES ('222', EMPTY_BLOB())");
               /* 查询此BLOB对象并锁定 */
               ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");
               while (rs.next()) {
                   /* 取出此BLOB对象 */
                   oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
                   /* 向BLOB对象中写入数据 */
                   BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
                   BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));
                   int c;
                   while ((c=in.read())!=-1) {
                       out.write(c);
                   }
                   in.close();
                   out.close();
               }
               /* 正式提交 */
               conn.commit();
           } catch (Exception ex) {
               /* 出错回滚 */
               conn.rollback();
               throw ex;
           }       /* 恢复原提交状态 */
           conn.setAutoCommit(defaultCommit);
       }