ORA-00942: 表或视图不存在

问题描述实体类直接调用save方法的时候报错“com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在at com.jfinal.plugin.activerecord.Model.save(Model.java:562).......”同时查询和修改没有问题,就只有插入报错。

开发环境:oracle12c  jfinal4.8

问题分析:

是因为com.jfinal.plugin.activerecord.Model类里面save方法有如下判斷:


if (config.dialect.isOracle()) {
pst = conn.prepareStatement(sql.toString(), table.getPrimaryKey());
} else {
pst = conn.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS);
}

其中报错的是这里:

pst = conn.prepareStatement(sql.toString(), table.getPrimaryKey());


这里涉及到jdbc的基础知识问题,我在此不想进行更深入的讨论。直接给解决办法:

1新建MyModel类,重写save方法。

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.jfinal.plugin.activerecord.ActiveRecordException;
import com.jfinal.plugin.activerecord.Config;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Table;
import com.jfinal.plugin.activerecord.dialect.Dialect;

public class MyModel<M extends MyModel<M>> extends Model<M> {
public boolean save() {
filter(FILTER_BY_SAVE);
Dialect dialect = _getConfig().getDialect();
Config config = _getConfig();
Table table = _getTable();
StringBuilder sql = new StringBuilder();
List<Object> paras = new ArrayList<Object>();
dialect.forModelSave(table, _getAttrs(), sql, paras);
Connection conn = null;
PreparedStatement pst = null;
int result = 0;
try {
conn = config.getConnection();
pst = conn.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS);
dialect.fillStatement(pst, paras);
result = pst.executeUpdate();
dialect.getModelGeneratedKey(this, pst, table);
_getModifyFlag().clear();
return result >= 1;
} catch (Exception e) {
throw new ActiveRecordException(e);
} finally {
config.close(pst, conn);
}
}
}


2 让你的实体基类继承MyModel

public abstract class BaseXjrBaseLog<M extends BaseXjrBaseLog<M>> extends MyModel<M> implements IBean


解决问题。

感谢Jfinal官方老师的支持!

评论区

JFinal

2020-04-29 19:22

生成 base model 使用的模板文件用到了没有?

生成 BaseXjrBaseLog 时需要用到一个你定制的 base_model_template.jf

JFinal

2020-04-29 19:24

你这里貌似有一个比较有意思的用法,那就是你的字段名、表名都添加了双引号

在添加双引号以后,查询出来的字段名是否被 oracle 自动转成了大写?

如果双引号可以避免 oracle 转换字段名大小写,将可以解决以往很多问题

马小酱

2020-04-30 15:09

不就是保存的时候主键的问题吗?Mapping的时候手动改一下主键不就行了吗?我用Oracle数据库没问题啊,设置好方言,忽略大小写,使用起来和mysql没有区别.

热门分享

扫码入社