最近在工作的时候,需要对数据库中的某些数据做导出报表的功能。由于之前有写好的方法,所以主体使用的此方法。在使用方法的过程中发现需要对数据库中的数据不同比照码表去改变报表中的数据格式。比如数据库中的1代表证件类型的身份证,0代表证件类型的其他。当时是在service层对Dao返回的数据集合做处理,然后返回一个改变后的数据集合给controller。但是发现在导出的时候,会因为Dao层返回的数据集合中信息的改变而造成数据库的更新,更新目标就是更改后的DAO返回集合。
项目中在service层方法上通过注解的方法开启事务,如下:@Transactional(propagation = Propagation.REQUIRED, readOnly = false)。后发现问题就是出在这个地方,hibernate事务在提交的时候会自动的对DAO返回进行类似"比对"的操作,发现有不同的话会随事务提交,从而造成数据的篡改。
解决本问题有两种办法,一种是在service层即事务控制范围内操作的时候,复制一个新的对象去替换他,通过新对象的属性判断原有对象的值。例如本系统中的导出报表:
第二种办法就更简单了,即把需要对DAO返回的数据集合做改变处理的操作放在事务控制范围之外的controller层
转载请注明原文地址: https://ju.6miu.com/read-450142.html