现在我的应用中有两个父子关系的类:A(父),B(子),A中的一个方法有默认的实现,在B中重写了方法的实现.
我用的是jdbctemplate,
我想问:
1.两个父子类的JdbcTemplate,PlatformTransactionManager在spring的配置文件中该怎么配置
2.若子类重载父类的方法实现时用了
class A{
   //etc
   A createEntity(A a){
     //这里有事物
   }
}
class B extends A{
   //etc
   B createEntity(B b){
      A a=super.createEntity(b);
      if(a!=null){
         //etc
      }
   }
}我在本地测试总时在A的方法(createEntity)处抛:空指针异常,spring配置文件中我父类和子类我都单独ref的一个目标jdbctemplate,TransactionManager.
指高手指点!先谢谢了

解决方案 »

  1.   

    B createEntity(B b)中也有事务!有什么方法可以保证事务的原子性,父类和子类持久化到两张表中,所以在插入子类时要保证父类先插入到库中并取回主键
      

  2.   

    ,spring配置文件中我父类和子类我都单独ref的一个目标你确信你获得Class B 的方法是正确的吗?
      

  3.   

    是这样的:
    在项目中有这样的需求!每个用户可以执行不同的任务.产生不同的任务实例:A当是一个抽像的任务实例(但不是abstract的)。属性都是每个任务实例共有的(任务的开始时间,任务的执行者,...)A存在一个表,各个子类存在一个表中,插入到库之前要用到A表的主键作关联.在编辑时(除了select语句以外)我都是用spring注入子类.你的意思是在子类实例的时候,父类不存在实例?
      

  4.   

    找到了确是:
    super.createEntity(b)  //这行有问题.
    哪有什么方法在spring注入B子类时能保证A也能实例化!
      

  5.   


    //抽象的任务实例DAO接口
    public interface TaskInstanceDao{
    List<TaskInstance> getAllTaskInstance()throws DataAccessException;
    ...//etc 一些查询
    //以下子类会重载或重写实现的方法
    TaskInstance createTaskInstance(TaskInstance taskinstance)throws DataAccessException;
    boolean finishTaskInstance(int taskInstanceID,int employeeID)throws DataAccessException;
    boolean deleteTaskInstance(int taskinstanceID)throws DataAccessException;
    boolean stopTaskInstance(int taskinstanceID)throws DataAccessException;
    }
    //子类的抽象接口
    public interface TaskInstanceSpecialDao<T extends TaskInstance> {
         T selectSpecialTaskInstance(int instanceID);
         T selectSpecialTaskInstance(String names);
         boolean createTaskInstance(T t);
    }//其中一个子类接口
    public interface ActionRecordDao extends TaskInstanceSpecialDao<ActionRecord> {}//父类的实现类
    //AbstractWrapperAccessor是jdbcTemplate的包装接口
    public class TaskInstanceDaoJImple implements TaskInstanceDao,AbstractWrapperAccessor<TaskInstance>{
    private JdbcTemplate jdbcTemplate;
    private PlatformTransactionManager transactionManager;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
    }
    public JdbcTemplate getJdbcTemplate() {
    return jdbcTemplate;
    }
    public void setTransactionManager(PlatformTransactionManager transactionManager) {
    this.transactionManager = transactionManager;
    }
            //static final String INSERT_TASKINSTANCE_SQL="INSERT INTO angle_taskinstance(topic,task_tid,employee_eeid)VALUES(?,?,?)";
            public TaskInstance createTaskInstance(TaskInstance taskinstance)throws DataAccessException {
    TaskInstance instance=taskinstance;            
                    int affectedrows=jdbcTemplate.update(JdbcSqlCollection.INSERT_TASKINSTANCE_SQL, 
    new Object[]{taskinstance.getTopic(),taskinstance.getTask().getId(),taskinstance.getEmployee().getId()}, 
    new int[]{Types.VARCHAR,Types.TINYINT,Types.INTEGER});
    if(affectedrows==1){
    int tid=jdbcTemplate.queryForInt(JdbcSqlCollection.SELECT_TASKINSTANCE_LASTRECORD_SQL, new Object[]{taskinstance.getEmployee().getId()}, new int[]{Types.INTEGER});
    if(tid>0) instance.setPid(tid);
    }
    return instance;
            }
            ...
    }
    //其中一个子类的实现
    public class ActionRecordDaoJImple extends TaskInstanceDaoJImple implements ActionRecordDao{
            private JdbcTemplate jdbcTemplate;
            private PlatformTransactionManager transactionManager;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
    }
    public void setTransactionManager(PlatformTransactionManager transactionManager) {
    this.transactionManager = transactionManager;
    }
    @Override
    public boolean createTaskInstance(ActionRecord t) {
    boolean isbool=false;
    if(super.getJdbcTemplate()==null){         //现在知道父类的jdbctemplate没有被注入抛出了空指针
    System.out.println("super class not instance");
    return false;
    }
    TaskInstance instance=super.createTaskInstance(t);
    if(instance!=null){
    int affectedrows=jdbcTemplate.update(JdbcSqlCollection.INSERT_ACTIONRECORD_SQL, new Object[]{
    instance.getPid(),
    t.getType(),
    t.getDispatchs().getId(),
    t.getClient().getId()
    });
    if(affectedrows==1) isbool=true;
    }
    return isbool;
    }        
           ...
    }//测试类
    public class ExecuteTask {
           public static void main(String[] args) {
                     ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
                     ActionRecordDao record=(ActionRecordDao)ac.getBean("recordJDAO");
                     TaskDao td=(TaskDao)ac.getBean("taskJDAO");         //任务的DAO
                     ActionRecord t=new ActionRecord(1,89,2531,td.selectTask("减员"));        //td.selectTask()拿到减员的任务对象
    boolean isacc=record.createTaskInstance(t);
    System.out.println(isacc);       
           }
    }
    //applicationContext.xml
    //现在的配置文件
        ...
        <!-- spring transaction manager -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
           <property name="dataSource" ref="dataSource" />
        </bean>
        <!-- spring jdbcTemplate -->    
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
           <property name="dataSource" ref="dataSource" />
        </bean>
        <bean id="taskJDAO" class="cn.ytdongli.dao.JDBC.Imple.TaskDaoJImple">
           <property name="jdbcTemplate" ref="jdbcTemplate" />
           <property name="transactionManager" ref="transactionManager" />
        </bean>
        <bean id="taskInstanceJDAO" class="cn.ytdongli.dao.JDBC.Imple.TaskInstanceDaoJImple" abstract="true">
           <property name="jdbcTemplate" ref="jdbcTemplate" />
           <property name="transactionManager" ref="transactionManager" />
        </bean>
        <bean id="recordJDAO" parent="taskInstanceJDAO" class="cn.ytdongli.dao.JDBC.Imple.ActionRecordDaoJImple">
          <property name="jdbcTemplate" ref="jdbcTemplate" />
          <property name="transactionManager" ref="transactionManager" />
        </bean>    昨天在子类的bean上加depends-on="taskInstanceJDAO"也不对
      

  6.   

    代码用到的表schema:------------------------------------------------------任务实例(抽象)(C)(+)
    create table angle_taskinstance(
    taid int identity(1,1) not null,
    --主题
    topic varchar(100) not null,
    --任务
    task_tid tinyint not null,
    --谁执行的
    employee_eeid int not null,
    --创建日期
    entrydate smalldatetime not null default getdate(),
    finishdate smalldatetime not null,
    state char(2) not null default 0,       --->0进行中/1完成/2中止/3删除的
    --foreign key(task_tid) references angle_task(tid),
    --foreign key(employee_eeid) references angle_employee(eeid),
    primary key(taid)
    )
    ------------------------------------------------------增员/减员(T4)(C)
    create table angle_actionrecord(
    taskinstance_taid int not null,
    --动作的类别
    actiontype varchar(10) not null default '增员',
    --目标对象
    dispatchemployee_deid int not null default 0, 
    --企业
    company_acid int not null default 0, 
    --foreign key(company_acid) references angle_company(acid)
    --foreign key(dispatchemployee_deid) references angle_dispatchemployee(deid),
    primary key(taskinstance_taid)
    )
      

  7.   

    try:
    把父类的jdbctemplate和transactionManager的private修饰符换成protected的
    把子类的dbctemplate和transactionManager去掉!