(1)Could not execute statement
①不能想SYS_LOG_MAIN_PK中插入数据主键冲突
结论:
代码中无对神通数据库主键策略生成支持,通过增加支持神通主键策略代码解决.
a.但是SYS_LOG_MAIN_PK是外键约束,代码中无体现。因此,查询SYS_LOG_MAIN
b.主键生成
b1. 然后,可以使用ctrl+h或者是通过错误栈找到SYS_LOG_MAIN的类,以及插入逻辑。
通过逻辑找到主键的生成逻辑是如果不是mysql,oracle就返回1。因为我认为神通是仿的oracle,
因此我抄了oracle的生成逻辑。else if("oscar".equals(getDataBaseType())){
return getValue(tableName, pkColumn);
}
b2.通过错误栈得知神通的数据库类型dataBaseType是oscar,因此,在判断条件中加oscar。
我的理解就是这就是打补丁哈哈。
遇到的坑
打断点,妈的从错误栈中打了调用过程和执行过程。结果啥也没获得,莉莉思路,想想应该打执行过程
的断点。因为真正的逻辑是在platformapp中也就是说platformapp和platform是通过webService进行交互的。
并且,webService通过invoke调用app,因此就要通过名称找到logService和他的方法addLogAcess方法。
所以果断在logDaoImpl,JdbcUtil,LogServiceImpl中打断点。
c.主键生成方法
在addLogAcess的方法里跑断点,因为错误栈中的变量显示不全,所以确定断点状态根本不在这。
c1.然后通过ctrl+t追addLogAcess的方法,找到他的方法,看到他生成的sql,报错说是id问题,那么继续追getPrimaryKey
的方法。在getPrimaryKey中已经定义了oscar的逻辑了,然后通过getValue继续追,追到了getValue。发现id的生成逻辑是查出来的。
c2.以前用mysql或者ORACL查询语句都没问题,但是神通的主键查询语句不同。因此,重新定义。
d.自定义神通主键生成语句sql
语句相同,但是神通的id变成了sql = "select "+tableName+"_ID_SEQ.nextval from dual ";
神通的列迁移后 表名_ID_SEQ
ORACLE是 sql = "select "+tableName+".nextval from dual ";
表名.nextval