现在我的应用中有两个父子关系的类: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.
指高手指点!先谢谢了
我用的是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.
指高手指点!先谢谢了
解决方案 »
- couldn't get lock for C:/Users/abao/Desktop/jkbendi/log/testlogger%g.log
- 各位大哥,我感觉这个算法有问题,是我经理写的,你们给解释下
- 关于数组存入数据库二进制大字段问题
- 求个OA办公系统的流程图
- 多线程服务器问题
- 将web项目导入到tomcat下,Eclipse报did not find a matching property异常,哪位大神知道??求解!!!
- spring+hibernate查询中文乱码问题
- 请问如何在struts的bean:write中 截取输出字符??
- 请教BMP问题.急,请帮助
- java可否使用共享内存?
- 求 JDK 1.5 英文版的API
- Hibernate 查询
在项目中有这样的需求!每个用户可以执行不同的任务.产生不同的任务实例:A当是一个抽像的任务实例(但不是abstract的)。属性都是每个任务实例共有的(任务的开始时间,任务的执行者,...)A存在一个表,各个子类存在一个表中,插入到库之前要用到A表的主键作关联.在编辑时(除了select语句以外)我都是用spring注入子类.你的意思是在子类实例的时候,父类不存在实例?
super.createEntity(b) //这行有问题.
哪有什么方法在spring注入B子类时能保证A也能实例化!
//抽象的任务实例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"也不对
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)
)
把父类的jdbctemplate和transactionManager的private修饰符换成protected的
把子类的dbctemplate和transactionManager去掉!