Hibernate执行查询后会引发update操作并报错的解决方法

刚刚发现一个bug,就是在执行了导出数据库中的数据到excel表格后再去执行查询操作会报错,通过将
 <property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
        <property name="hibernate.show_sql">false</property>
        <property name="javax.persistence.validation.mode">none</property>

hibernate.show_sql语句属性改为false查看打印的语句发现select语句后又执行了update语句,因此查了些资料并结合代码找到了原因,

因为在执行导出操作时,会对查询出来的持久化状态的对象进行set赋值操作,如下:

list = ps.queryProgram(condition, scrollPage);
if(mediastatus !=null && "0".equals(mediastatus)){
	list.get(i).setMediastatus(config.getMediastatus0());
				}

由于查询出来的对象的属性被重新赋值了,和数据库的值不对应;导致hibernate判断查询出来的对象发生了变化,因此自动执行了更新操作,操作会更新到数据库,但由于新字段的值位数超过了数据库对应列的大小限制,因此报错了

 “ORA-12899: value too large for column "WACOS"."PROGRAM"."STATUS" (actual: 9, maximum: 1)”

所以,我在查询出结果后再重新复制了一份查询结果对象然后对复制后的对象执行了set操作,这样就避免了直接对查询出的对象进行set操作而引起Hibernate会执行更新操作的问题。

list = ps.queryProgram(condition, scrollPage);
//为了避免查询出的program对象在set操作后会自动更新,所以重新复制了一份查询出的对象!
List<Program> newlist = new ArrayList<Program>(list.size());
	for(Program program : list){
	Program program2 = new Program();
	BeanUtils.copyProperties(program2, program);
	newlist.add(program2);
			}
	list = newlist;
if(mediastatus !=null && "0".equals(mediastatus)){
	list.get(i).setMediastatus(config.getMediastatus0());
				}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值