出现这种问题主要是因为hibernate的Session已经关闭,造成你的修改操作是在没有事务的环境下提交的,所以就会报这种错
解决方案 »
- 关于web中mysql密码存放方式
- weblogic 访问程序报错
- MyEclipse中新建一个web项目,一打开jsp页面就弹出页面错误
- 一个关于jdbc连接的问题
- 关于对人事系统中人的角色的建模。
- struts2超级难题,action,404.
- 做J2EE企业业务平台有前途吗?
- 在启动WebLogic Server服务器,当调用处理大量数据的类时,会抛出java.lang.OutOfMemory内存溢出错误!不知道怎么解决这个问题!!
- 高分求助 eclipse配置hibernate插件问题
- 安装JBuilder出现的一个问题!再现等救!
- hibernate中文检索问题!急!!!
- ejb连接oracle的问题
不知能不能帮到你,顶一下
你好,说详细些嘛,我的配置在上面都写好了的,你看那里出了问题
public void saveObject(File imgFile){
TbCommodity commodity = new TbCommodity();
try {
byte[] commodityImg = org.springframework.util.FileCopyUtils.copyToByteArray(imgFile);
commodity.setCommodityImg(commodityImg);
} catch (IOException e) {
System.out.println("二进制数组未转化成功......");
}
commodityDAO.save(commodity);
}
而这个saveObject方法,是要为一个事务才可以。
DynaActionForm df = (DynaActionForm)form;
(FormFile)df.getstring("前台文件上传标签name").getFileData()这样来直接转化为二进制数据的.为什么你这里要这样来转化呢?
DAO中的保存文件代码为:
public boolean declareProject(Project project) {
try{
this.getHibernateTemplate().save(project);
return true;
}catch(DataAccessException e){
throw e;
}
}
PO中的相应属性类型为:byte[],xml中的类型为:org.springframework.orm.hibernate3.support.BlobByteArrayType
ApplicationContent.xml中的配置代码为:
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="default"/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="lobHandler" ref="lobHandler"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>***.hbm.xml</value>
</list>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="projectDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target">
<ref local="projectDAO"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="edit*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="projectDAO"
class="com.PMS.DaoImp.ProjectDaoI"
singleton="true">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="projectServices"
class="com.PMS.ServicesImp.ProjectServicesI"
singleton="true">
<property name="projectDao">
<ref local="projectDAO"/>
</property>
</bean>
还有的就没有贴出来了大哥,希望帮帮小弟,小弟已经搞了几天了
你的(FormFile)df.getstring("前台文件上传标签name").getFileData()不会报错吗?
还有你的service并没有用事务管理。spring1.x的事务配置:<bean id="projectDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
......
</bean>
<bean id="projectServicesTarget"
class="com.PMS.ServicesImp.ProjectServicesI"
singleton="true">
<property name="projectDao">
<ref local="projectDAO"/>
</property>
</bean>
<bean id="projectServices" parent="projectDAOProxy">
<property name="target">
<ref local="dictServiceTarget"/>
</property>
</bean>这样你的projectServices中的save*就是一个事务,你的copyToByteArray应该在这个是事务里执行。
但是我还是有些不明白,为什么你会这样说呢"这样你的projectServices中的save*就是一个事务,你的copyToByteArray应该在这个是事务里执行"
我把我的原因帖出来,希望大哥您能多多指点, DynaActionForm df = (DynaActionForm)form;
(FormFile)df.getstring("前台文件上传标签name").getFileData();这样可以实现将上传的文件转化为二进制文件,我测试通过了的./**
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="default"/> <!--spring 对hibernate的封装,完成了hibernate中的hibernate.cfg.xml 文件所需要的基础申明,并按照工作方式将这些配置申明注入org.springframework.orm.hibernate.LocalSessionFactoryBean中 --><bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="lobHandler" ref="lobHandler"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect"> ${hibernate.dialect} </prop>
<prop key="hibernate.show_sql"> ${hibernate.show_sql} </prop>
</props>
</property>
<property name="mappingResources">
<list> <value> ***.hbm.xml </value></list>
</property>
</bean>
<!--事务管理进行声明-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean> <!--spring 对事务管理的支持,利用AOP为projectDAO注入事务处理的工作-->
<bean id="projectDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target">
<ref local="projectDAO"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="create*"> PROPAGATION_REQUIRED </prop>
<prop key="edit*"> PROPAGATION_REQUIRED </prop>
<prop key="find*"> PROPAGATION_REQUIRED,readOnly </prop>
<prop key="delete*"> PROPAGATION_REQUIRED </prop>
<prop key="save*"> PROPAGATION_REQUIRED </prop>
</props>
</property>
</bean>
<!--对DAO创建进行管理,并注入SessionFactory,为DAO的实现类提供服务-->
<bean id="projectDAO"
class="com.PMS.DaoImp.ProjectDaoI"
singleton="true">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean> <--对业务逻辑的创建进行了管理,依赖注入了实现的DAO-->
<bean id="projectServices"
class="com.PMS.ServicesImp.ProjectServicesI"
singleton="true">
<property name="projectDao">
<ref local="projectDAO"/>
</property>
</bean> 根据我的注释来分析,其中的上传文件方法在projectServices接口的实现类com.PMS.ServicesImp.ProjectServicesI中,为什么说没有处于事务范围呢?
大哥请您多多指点哦?小弟需要您的指点,我是初学者哦,谢谢,待我在您的帮助下解决后高分相送.
因为你的service没有配置事务管理啊[color=#FF0000<property name="target">
<ref local="projectDAO"/>
</property> [/color]改成<property name="target">
<ref local="projectServices"/>
</property>试下……
因为前面很多事务都是执行的,就是这里的文件上传有问题
大哥,我这里按照你那样修改了还是有问题的,哎!