在使用ORACLE数据库时,生成MODEL的主键有问题

用的JFINAL3.0,连接的是ORACLE数据库,通过生成器生成model,然后发现_MappingKit里面的主键有问题,我的表都是单主键的,不知道为啥生成出来有的model给配了好多主键。

blob.png

blob.png

blob.png

blob.png

虽然可以手动矫正_MappingKit,但是还是想知道为啥=。=


评论区

JFinal

2017-05-04 20:57

这个问题从没碰到过,换个数据库驱动试试

ALways昵称已被注册

2017-05-08 16:35

@JFinal ojdbc6用的是您压缩包里的 去官方下的貌似也这样=。=很费解

mld2024

2018-03-19 10:38

现在知道答案了吗,我也遇到这个问题了,之前没事,现在一生成突然出现好多ID

ALways昵称已被注册

2018-04-09 16:05

@mld2024 印象里是没有= =手删

JFinal

2018-04-09 16:11

@mld2024 @ALways昵称已被注册 很可能是 oracle 驱动的问题,升级试试

不建议手删,可以继承 MetaBuilder,覆盖掉父类的buildPrimaryKey(...) 方法,对于重复的主键值做一下清除

这个问题肯定是与 jfinal 无关的,jfinal 是从底层读的 meta 信息,mysql sqlserver 这些数据库都正常,oracle 也只碰到这一例有问题,jfinal 代码是同样一套

setygz

2018-09-06 19:06

问题在于 Jfinal 3.x中的 MetaBuilder 对象,中的方法:
protected void buildPrimaryKey(TableMeta tableMeta) throws SQLException {
ResultSet rs = dbMeta.getPrimaryKeys(conn.getCatalog(), null, tableMeta.name);

String primaryKey = "";
int index = 0;
while (rs.next()) {
if (index++ > 0) {
primaryKey += ",";
}
primaryKey += rs.getString("COLUMN_NAME");
}
if (StrKit.isBlank(primaryKey)) {
throw new RuntimeException("primaryKey of table \"" + tableMeta.name + "\" required by active record pattern");
}
tableMeta.primaryKey = primaryKey;
rs.close();
}

问题代码在于,
ResultSet rs = dbMeta.getPrimaryKeys(conn.getCatalog(), null, tableMeta.name);
由于你使用的 ojdbc6 驱动,conn.getCatalog() 没有返回数据库 schema ,而第二个参数,schema又传入的 null参数,导致你取到了 数据库实例的多个 包含该表名的schema中主键记录 。如果你第二个参数传入 schema 就生成正常了

setygz

2018-09-06 19:10

@JFinal 问题在于以下我描述的地方,如果源码可以做一下改进应该使用起来更好了。oracle实例中,包含该表名字的schema 有多个,且ojdbc6 conn.getCata() 返回了null ,就出现了该问题。

setygz

2018-09-06 19:11

JFinal

2018-09-06 20:41

@setygz 具体的代码要改成什么样子? 是不是改成下面:
ResultSet rs = dbMeta.getPrimaryKeys(conn.getCatalog(), conn.getSchema(), tableMeta.name);

由于我这里没有测试环境,麻烦帮忙测试一下

setygz

2018-09-07 12:54

@JFinal
Exception in thread "main" java.lang.RuntimeException: java.sql.SQLFeatureNotSupportedException
at com.jfinal.plugin.activerecord.generator.MetaBuilder.build(MetaBuilder.java:102)
at com.jfinal.plugin.activerecord.generator.Generator.generate(Generator.java:262)
at com.GenModel.TestGeneratorModel.main(TestGeneratorModel.java:59)
Caused by: java.sql.SQLFeatureNotSupportedException
at com.alibaba.druid.pool.DruidPooledConnection.getSchema(DruidPooledConnection.java:1191)
at com.GenModel.TestGeneratorModel$_MetaBuilder.buildPrimaryKey(TestGeneratorModel.java:88)
at com.jfinal.plugin.activerecord.generator.MetaBuilder.build(MetaBuilder.java:96)
... 2 more

热门反馈

扫码入社