通常事務是坐在service層,所以事務也會在這層來處理,servece層可以有多個dao接口且配置聲明的事務處理,如下@Component public class PaApplyAuditManagerImp implements PaApplyAuditManager { private ParameterDao parameterDao;
private PaApplyAuditDao paApplyAuditDao;
private PaProjectApplyDao paProjectApplyDao;
@Autowired public void setParameterDao(ParameterDao parameterDao){ this.parameterDao=parameterDao; }
@Autowired public void setPaProjectApplyDao(PaProjectApplyDao paProjectApplyDao) { this.paProjectApplyDao = paProjectApplyDao; }
@Autowired public void setPaApplyAuditDao(PaApplyAuditDao paApplyAuditDao) { this.paApplyAuditDao = paApplyAuditDao; } @Transactional public PaApplyAuditBO query(LoginUserBO loginUser, PaApplyAuditQC PaApplyAuditQC) throws ApplicationException {//qc對象估計類似于你的 detachedCriteria PaApplyAuditBO bo = this.paApplyAuditDao.query(loginUser, PaApplyAuditQC);
service里面则是引用了dao扩展,比如要查询某个具体的表调用DAO传入对象即可,如果需要其他查询,在service里面写入HQL
action里面则是调用service的,方法已经由service实现,不需要与hibernate挂钩了
我在dao 中写了个方法通过传detachedCriteria对象来查询。这样的话我可以在action里写出查询语句了。也比较灵活。
你中间遗忘了service,它可以组成具体的action里面你想要的方法供action调用
查询数据,我习惯吧业务处理都放到service层 当然我不敢说很合理不过我感觉这个应该可以接受。
冒失我提了好几个问题。1:dao是否只要有一个daoInterface 和daoImpl就可以了。(用范型做成通用的)
2:在service层如果我需要操作多个dao的时候,怎么做事务。(dao有接口回调可以处理事务)!!!!!
3:就是那个复杂查询的问题。我想的是通过传入参数给service-dao,然后在dao中动态生成hql.可是诸如日期介于。。之间这些条件就蛮难构造。如果只是==或是like之类的动态生成我是会的。
public class PaApplyAuditManagerImp implements PaApplyAuditManager {
private ParameterDao parameterDao;
private PaApplyAuditDao paApplyAuditDao;
private PaProjectApplyDao paProjectApplyDao;
@Autowired
public void setParameterDao(ParameterDao parameterDao){
this.parameterDao=parameterDao;
}
@Autowired
public void setPaProjectApplyDao(PaProjectApplyDao paProjectApplyDao) {
this.paProjectApplyDao = paProjectApplyDao;
}
@Autowired
public void setPaApplyAuditDao(PaApplyAuditDao paApplyAuditDao) {
this.paApplyAuditDao = paApplyAuditDao;
} @Transactional
public PaApplyAuditBO query(LoginUserBO loginUser,
PaApplyAuditQC PaApplyAuditQC) throws ApplicationException {//qc對象估計類似于你的 detachedCriteria PaApplyAuditBO bo = this.paApplyAuditDao.query(loginUser, PaApplyAuditQC);
if(bo!=null){
this.paApplyAuditDao.initialize(bo.getPaAttachmentAuditDetail());
this.paApplyAuditDao.initialize(bo.getPaExpenseDetail());
}
return bo;
}
@Transactional
public void update(LoginUserBO loginUser, PaApplyAuditBO paApplyAuditBO)
throws ApplicationException {
PaApplyAuditBO bo = this.paApplyAuditDao.get(loginUser, paApplyAuditBO.getUid());
if(bo.getModificationNum()!=null)bo.setModificationNum(bo.getModificationNum()+1);
....略
this.paApplyAuditDao.update(loginUser, bo);
}
dao:@Repository
public class PaProjectApplyDaoImp extends GenericHibernateDao<PaProjectApplyBO, String> implements PaProjectApplyDao { public Integer count(PaProjectApplyQC PaProjectApplyQC) throws PersistenceException {
QueryObject queryObject = getQueryObject(PaProjectApplyQC);
return this.count(queryObject);
} public List<PaProjectApplyBO> search(PaProjectApplyQC PaProjectApplyQC) throws PersistenceException {
QueryObject queryObject = getQueryObject(PaProjectApplyQC);
queryObject.setRang(PaProjectApplyQC.getHeadIndex(), PaProjectApplyQC.getMaxCount());
queryObject.addSort(PaProjectApplyQC.getSort());
return this.search(queryObject);
} private QueryObject getQueryObject(PaProjectApplyQC PaProjectApplyQC) throws PersistenceException{
QueryObject queryObject = new QueryObject(PaProjectApplyBO.class);
//启用标志
if(!StringUtils.isEmpty(PaProjectApplyQC.getUsingFlag())){
queryObject.addCriterion(new Criterion(PaProjectApplyDao.USINGFLAG, Criterion.EQUAL_TO, PaProjectApplyQC.getUsingFlag()));
}
//审核状态(取得审核状态>=14的表示已经提交审核的数据)
if(!StringUtils.isEmpty(PaProjectApplyQC.getAuditFlag())){
queryObject.addCriterion(new Criterion(PaProjectApplyDao.AUDITFLAG, Criterion.GREATER_EQUAL, PaProjectApplyQC.getAuditFlag()));
}
return queryObject;
}
sping的事務
<context:component-scan base-package="com.nes.platform.service.managerimp"/>