错误栈 登录时爆发错误 Could not execute statement

  (1)Could not execute statement


错误栈 登录时爆发错误 Could not execute statement_第1张图片

①不能想SYS_LOG_MAIN_PK中插入数据主键冲突

结论:

代码中无对神通数据库主键策略生成支持,通过增加支持神通主键策略代码解决.

a.但是SYS_LOG_MAIN_PK是外键约束,代码中无体现。因此,查询SYS_LOG_MAIN


错误栈 登录时爆发错误 Could not execute statement_第2张图片

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。

我的理解就是这就是打补丁哈哈。


错误栈 登录时爆发错误 Could not execute statement_第3张图片

遇到的坑

      打断点,妈的从错误栈中打了调用过程和执行过程。结果啥也没获得,莉莉思路,想想应该打执行过程


错误栈 登录时爆发错误 Could not execute statement_第4张图片

      的断点。因为真正的逻辑是在platformapp中也就是说platformapp和platform是通过webService进行交互的。

      并且,webService通过invoke调用app,因此就要通过名称找到logService和他的方法addLogAcess方法。

        所以果断在logDaoImpl,JdbcUtil,LogServiceImpl中打断点。


错误栈 登录时爆发错误 Could not execute statement_第5张图片

c.主键生成方法

      在addLogAcess的方法里跑断点,因为错误栈中的变量显示不全,所以确定断点状态根本不在这。


错误栈 登录时爆发错误 Could not execute statement_第6张图片

c1.然后通过ctrl+t追addLogAcess的方法,找到他的方法,看到他生成的sql,报错说是id问题,那么继续追getPrimaryKey


错误栈 登录时爆发错误 Could not execute statement_第7张图片

的方法。在getPrimaryKey中已经定义了oscar的逻辑了,然后通过getValue继续追,追到了getValue。发现id的生成逻辑是查出来的。


错误栈 登录时爆发错误 Could not execute statement_第8张图片

c2.以前用mysql或者ORACL查询语句都没问题,但是神通的主键查询语句不同。因此,重新定义。


错误栈 登录时爆发错误 Could not execute statement_第9张图片

d.自定义神通主键生成语句sql


错误栈 登录时爆发错误 Could not execute statement_第10张图片

    语句相同,但是神通的id变成了sql = "select "+tableName+"_ID_SEQ.nextval from dual ";

神通的列迁移后  表名_ID_SEQ

ORACLE是  sql = "select "+tableName+".nextval from dual ";

表名.nextval

你可能感兴趣的:(错误栈 登录时爆发错误 Could not execute statement)