1. 问题
一个视频点播项目,视频文件可访问地址需要加签名鉴权,签名是有有效期的,所以数据库存储的是视频文件正常播放地址url,每次查询时再加上签名,返回给前端。
数据库持久层用的是hibernate,service上面加了事务@Transactional。“在一个事务里,如果你更新了持久化对象的某个字段,即使你没有显式的调用session.update(obj),
Hibernate的事物管理器也会自动帮你去更新这个对象”。即,我们每次给url加上签名后,就会自动更新到数据库里面,我们不希望这样,每次都多一个无谓的数据库操作,浪费资源。
解决办法,可以是去掉事务,或者事务标记为只读,但这不是根本解决办法。这个方法确实只有读数据库操作,没必要加事务,但是我们不能保证其他方法也都不需要事务。
另外还遇到像数据库存储地址区域代码,返回给前端需要转换为中文名称等,都是一样的问题。
2. 解决办法:创建VO对象
其他的还有DTO等等,这里用不到,不去解释,有兴趣可以去搜。VO的意思就是展示层使用的对象。通常从数据库查询出的记录,前端展示的时候并不需要所有字段,有的字段还需要修改才能展示,所以我们可以不去修改从数据库读取出来的持久化对象,而是按照需要取出需要的数据包装成一个VO去返回给前端。
3. 应该尽量使用VO
即使不存在上面的问题,比如你使用MyBatis而不用Hibernate,也应该使用VO,因为把数据库查询出的所有字段不管不顾直接返回给前端,确实不是一个好的做法。













网友评论