GeneratorUtil ORM工具,生成数据库和实体的映射oracle 数据字典为true报错,表前缀不起作用

public class GeneratorUtil {
    public static void main(String[] args) {
        //base model 所使用的包名
        String baseModelPackageName = "com.link.model.base";
        //base model 保存路径
        String baseModelOutputDir = PathKit.getWebRootPath() + "/src/main/java/com/link/model/base";

        //model 所使用的包名(MappingKit默认使用的包名)
        String modelPackageName = "com.link.model";
        //model 文件保存路径(MappingKit 与 DataDictionary 文件默认保存路径)
        String modelOutputDir = baseModelOutputDir + "/..";

        //创建生成器
        Generator generator = new Generator(getDataSource(),baseModelPackageName,baseModelOutputDir,modelPackageName,modelOutputDir);
        //设置数据库方言
        generator.setDialect(new OracleDialect());
        //设置是否在model中生成dao对象
        generator.setGenerateDaoInModel(true);
        //设置是否生成字典文件
        generator.setGenerateDataDictionary(false);
        // 设置需要被移除的表名前缀用于生成modelName。例如表名 "osc_user",移除前缀 "osc_"后生成的model名为 "User"而非 OscUser
        generator.setRemovedTableNamePrefixes("t_");
        //生成
        generator.generate();
    }

    public static DataSource getDataSource() {
        Prop p = PropKit.use("config.properties");
        DruidPlugin dp = new DruidPlugin(p.get("jdbc_url"),p.get("jdbc_username"),p.get("jdbc_password"));
        dp.setValidationQuery(p.get("validationQuery"));
        dp.setDriverClass(p.get("driverClassName"));
        dp.start();
        return dp.getDataSource();
    }
}


//设置是否生成字典文件
        generator.setGenerateDataDictionary(false);
        // 设置需要被移除的表名前缀用于生成modelName。例如表名 "osc_user",移除前缀 "osc_"后生成的model名为 "User"而非 OscUser
        generator.setRemovedTableNamePrefixes("t_");


数据字典设置为true报错,表前缀不起作用,生成的实体还是有t

评论区

JFinal

2017-06-23 11:05

单步调试一下看看具体是哪一步有问题

JFinal

2017-06-23 11:06

在 MetaBuilder 中设置断点,里面有一个生成 table 的 Meta 信息的处理,看那个处理对前缀的处理出了什么问题

linkzz

2017-06-25 12:41

Exception in thread "main" java.lang.RuntimeException: java.sql.SQLException: 流已被关闭
at com.jfinal.plugin.activerecord.generator.DataDictionaryGenerator.rebuildColumnMetas(DataDictionaryGenerator.java:205)
at com.jfinal.plugin.activerecord.generator.DataDictionaryGenerator.generate(DataDictionaryGenerator.java:61)
at com.jfinal.plugin.activerecord.generator.Generator.generate(Generator.java:248)
at GeneratorUtil.main(GeneratorUtil.java:39)
Caused by: java.sql.SQLException: 流已被关闭
at oracle.jdbc.driver.LongAccessor.getBytesInternal(LongAccessor.java:156)
at oracle.jdbc.driver.LongAccessor.getBytes(LongAccessor.java:126)
at oracle.jdbc.driver.LongAccessor.getString(LongAccessor.java:201)
at oracle.jdbc.driver.T4CLongAccessor.getString(T4CLongAccessor.java:427)
at oracle.jdbc.driver.OracleResultSetImpl.getString(OracleResultSetImpl.java:1251)
at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:494)
at com.jfinal.plugin.activerecord.generator.DataDictionaryGenerator.rebuildColumnMetas(DataDictionaryGenerator.java:179)
... 3 more @JFinal

jambolleo

2017-08-24 16:29

@JFinal 我也碰到这个问题了,在俱乐部群里给您留言了,我单步进去是在DataDictionaryGenerator这个类的rebuildColumnMetas方法里面,在取字段的默认值的时候,columnMeta.defaultValue = rs.getString("COLUMN_DEF"); 这里报错,但也不是每个字段都报错,我的表里面5个字段,第三个字段取默认值的时候报错,所以处理起来有点头疼。

jambolleo

2017-08-24 16:32

百度这个错误,一般是SELECT语句的字段顺序和RS的GET顺序对不上所致,但我取默认值后面的 rs.getString("REMARKS")又能取到值。

JFinal

2017-08-24 17:21

@jambolleo 试试换上最新的 oracle 驱动试试,碰到这个问题的同学很少,我自己没有 oracle 测试环境,也不知道原因

jambolleo

2017-08-25 09:34

@JFinal 我第一反应也是驱动太久,已经更换了最新的驱动,还是未果。

jambolleo

2017-08-25 10:46

@JFinal 现在覆盖rebuildColumnMetas方法,然后不处理columnMeta.defaultValue = rs.getString("COLUMN_DEF");

JFinal

2017-08-25 11:18

@linkzz @jambolleo 第 179 行代码如下:
columnMeta.defaultValue = rs.getString("COLUMN_DEF"); // 默认值

是一个取默认值的方法,而该方法前面还有很多 re.getString(...) 方法已成功被调用,按理说要是不能调用 rs.getString(...) 那么所有都不能调用。所以这个问题很可能是 oracle 的一个 bug

建议的解决办法有如下三个,任选其一:
1:columnMeta.defaultValue = rs.getString("COLUMN_DEF"); 这行代码直接改成:columnMeta.defaultValue = "",也就是不再使用这行代码
2:尝试去掉 201 行的 rs.close(); 看有没有效果
3:多尝试几个驱动程序

jambolleo

2017-08-25 14:03

@JFinal 谢谢波总!

热门反馈

扫码入社