因为dao层都是单表操作, 而业务层会涉及到多表操作,在业务层做切面事务,更安全
表于表之间是有关联的,操作的时候如果一张表出错了,那么可能会连带使其所关联的表数据操作失败,而其没有被切面切入事务的话,无法做到回滚!
关于懒加载
经常会用到懒加载去定义一个对象 , 那么为什么要懒加载呢?
懒加载可以优化数据库的压力,不用每个都去查询,只会在调用到这个对象的时候才会去执行sql语句查询
但是呢,同时懒加载也带来了一个不方便的地方,就是会报出一个异常 no session
这个异常时怎么出现的呢? 调用的时候 有包含被设置了懒加载的对象! 查询语句已经结束了,session已经关闭了 ,
这个时候去调用 被懒加载的对象无法去使用session 就会出错~
那么怎么解决呢? 关闭懒加载?
在使用注解的情况下将 fetch=FetchType.LAZY 改成 fetch=FetchType.EAGER 就没问题了 ,可是这就没有意义了,并且也很不安全
最好的解决办法 就涉及到了 切面事务
切面扩大了session 的范围,所有被切面的类 都会被包括在session范围内,
在操作有关懒加载的对象前,在切面切入的类方法中, 调用一次,让懒加载运行,也就达成了在session关闭之前,处理查询,解决no session问题