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());
				}





已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页