在ssh项目中,事务处理放在哪一层比较好,service还是DAO层上???我把spring的事务放在service层上,可是在做添加记录时出现了问题。
1.在保存对账文件时需要检查是否有同时期的记录已经存在
2.如果有相同记录,先删除然后在添加新的记录
现在的问题是新数据没办法添加,旧的数据删除不掉,报的错误是违反了唯一约束。
代码如下:
public class CPBillServiceImpl implements ICPBillService { private ICPBillDAO cpBillDAO; public void setCpBillDAO(ICPBillDAO cpBillDAO) {
this.cpBillDAO = cpBillDAO;
} /**
 * 保存对账文件
 * */
public CPBill saveCPBill(CPBill cpBill){
CPBill cp = this.cpBillDAO.getCPBillByInfo(cpBill);
if(cp != null)
this.cpBillDAO.deleteCPBill(cp); }
this.cpBillDAO.save(cpBill);
return cpBill;
}
}

解决方案 »

  1.   

    放在service层吧,因为你要用到spring注入机制dao可能会在注入时用的是interFace!
      

  2.   

    事务一般放在Service层,因为Service层一般是用来处理业务逻辑的,上承表现层,下启数据访问层,所以将事务放在Service层好
      

  3.   

    嗯,放service比较合理点,层次分明
      

  4.   

    最好在serivice~~~那样处理起来层次清楚,不容易混淆~~~~~~
      

  5.   

    肯定是放service层,但是LZ你要么就把源码放上来看看,这样貌似看不出来。
      

  6.   

    DAO层一般就是增删改,service层才是业务逻辑,一个具体的入账操作可能涉及到多个DAO的增加修改操作,所以你应该把事务放在service层
      

  7.   

    这是applicationContext.xml配置文件的一部分: <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingDirectoryLocations">
    <list>
    <value>classpath:/com/server/zzc/model</value>
    </list>
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.jdbc.batch_size">50</prop>
                    <prop key="hibernate.connection.release_mode">auto</prop>   
                    <prop key="hibernate.autoReconnect">true</prop>  
    </props>
    </property>
    </bean> <!-- ******************************************************* -->
    <bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref local="sessionFactory" />
    </property>
    </bean> <!-- ********************************************************** --> <bean id="transactionInterceptor"
    class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager" ref="transactionManager" />
    <property name="transactionAttributes">
    <props>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="save*">PROPAGATION_REQUIRED</prop>
    <prop key="do*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="delete*">PROPAGATION_REQUIRED</prop>
    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
    </props>
    </property>
    </bean> <bean
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames">
    <list>
    <value>*Service</value>
    </list>
    </property>
    <property name="interceptorNames">
    <list>
    <value>transactionInterceptor</value>
    </list>
    </property>
    </bean>
    <!-- ********************************************************** -->
    <import resource="zzc/daoContext.xml" />
    <import resource="zzc/serviceContext.xml" />
    daoContext.xml内容:
    <beans>
    <bean id="cpBillDAO" class="com.server.zzc.dao.impl.CPBillDAOImpl" autowire="byName"></bean>
    </beans>serviceContext.xml内容:
    <beans>
    <bean id="cpBillService" class="com.server.zzc.service.impl.CPBillServiceImpl">
    <property name="cpBillDAO" ref="cpBillDAO"/>
    <property name="checkRecordDAO" ref="checkRecordDAO"/>
    </bean>
    </beans>
    代码:
    public class CPBillServiceImpl implements ICPBillService {
      private ICPBillDAO cpBillDAO;  public void setCpBillDAO(ICPBillDAO cpBillDAO) {
        this.cpBillDAO = cpBillDAO;
      }  public CPBill saveCPBill(CPBill cpBill){
        CPBill cp = this.cpBillDAO.getCPBillByInfo(cpBill);
        if(cp != null){
          this.cpBillDAO.deleteCPBill(cp);
        }
        this.cpBillDAO.save(cpBill);
        return cpBill;
    }
    }
      

  8.   

    相同的记录你是指整条记录都相同 还是用某一个字段相同来标识啊 如果是用某一个字段的话
     
    你可以根据这个字段查数据库如果返回list不为空则删除list,然后再插入新的数据