【发布时间】:2016-07-02 13:57:12
【问题描述】:
环境:
雄猫 6
春季 4
休眠 4
Spring MVC
代码:
我有以下服务层类:
public interface AbhisheskService {
public List<AbhishekDTO> findByMatchingCriteria(AbhishekDetailsSearchDTO searchDto);
}
@Service("abhishekService")
public class AbhishekServiceImpl implements AbhisheskService {
@Autowired
private AbhishekDao abhishekDao;
@Transactional
public List<AbhishekDTO> findByMatchingCriteria(AbhishekDetailsSearchDTO searchDto) {
return getAbs();
}
public List<AbhishekDTO> getAbs(){
Abhishekdetails absDt = this.abhishekDao.get(4L);
return null;
}
}
AbhishekDao 是一个标准的 DAO 层接口,它扩展了 GenericDAO 超级接口。
public interface AbhishekDao extends GenericDAO<Abhishekdetails, Long>{
public List<Abhishekdetails> findByMatchingCriteria(AbhishekDetailsSearchDTO searchDto);
}
我的问题是:
findByMatchingCriteria 方法标记为@Transactional.
此方法调用另一个方法getAbs,它未标记为@Transactional,并在findByMatchingCriteria(自调用)中调用。
根据我的理解:
1)findByMatchingCriteria 在自身内部调用getAbs(自调用),getAbs() 方法不应在事务内部运行。因为这里绕过了动态创建的代理
2) 更何况 getAbs 上没有 @Transactional 注释。
3) 但是当getAbs 调用this.abhishekDao.get(4L) 时,一切正常,并检索到ID 4L 的记录。 DAO bean 在其内部调用 sessionFactory.getCurrentSession() 以从 Db 获取对象。但是为什么这行得通?
因为不应该有任何活跃的交易。
4)为什么上面的代码可以工作?很多关于 Spring Transaction 管理的帖子都表明自我调用不起作用。 (甚至是春季文档)。
那为什么上面的设置有效?
我在这里有什么遗漏吗?
还是我对spring事务的理解有误?
因为我在这里感到困惑,请回复
【问题讨论】:
标签: java spring hibernate spring-mvc transactions