JFinal 2.1 Generator 多schema下的生成问题

代码搬运工程师 发布于 2016/01/07 22:13
阅读 997
收藏 0

使用了postgersql数据库,数据库中有多个schema,如果一个表在一个非public schema下有,但public schema下没有的话就会报错。

Exception in thread "main" java.lang.RuntimeException: org.postgresql.util.PSQLException: ERROR: relation "xxxxx" does not exist
  位置:15
at com.jfinal.plugin.activerecord.generator.MetaBuilder.build(MetaBuilder.java:101)
at com.jfinal.plugin.activerecord.generator.Generator.generate(Generator.java:196)
at GeneratorDemo.main(GeneratorDemo.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: org.postgresql.util.PSQLException: ERROR: relation "xxxxx" does not exist
  位置:15
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:622)
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:458)
at org.postgresql.jdbc.PgStatement.executeQuery(PgStatement.java:374)
at com.jfinal.plugin.activerecord.generator.MetaBuilder.buildColumnMetas(MetaBuilder.java:169)
at com.jfinal.plugin.activerecord.generator.MetaBuilder.build(MetaBuilder.java:96)
... 7 more

这个问题怎么解决?

加载中
1
玛雅牛
玛雅牛

引用来自“玛雅牛”的评论

jdbc:postgresql://localhost:15432/djpt?currentSchema=public,sys,app
最后的参数就是搜索schema的顺序。使用这个参数试一试。

引用来自“monkeyaround”的评论

加了currentSchema=public,但好像没起作用啊,我用的是tomcat连接池,不知道和这个有没有关系。

生成的时候还是会去查全部的schema

我用的是druid,需要添加所有的Schema,public之外使用的都需要。

1
代码搬运工程师
代码搬运工程师

引用来自“玛雅牛”的评论

jdbc:postgresql://localhost:15432/djpt?currentSchema=public,sys,app
最后的参数就是搜索schema的顺序。使用这个参数试一试。

引用来自“monkeyaround”的评论

加了currentSchema=public,但好像没起作用啊,我用的是tomcat连接池,不知道和这个有没有关系。

生成的时候还是会去查全部的schema

引用来自“玛雅牛”的评论

我用的是druid,需要添加所有的Schema,public之外使用的都需要。

嗯,明白了,谢谢,果然schema都加进去就好了
0
JFinal
JFinal

   在 MetaBuilder 中找到这行代码:

ResultSet rs = dbMeta.getTables(conn.getCatalog(), null, null, new String[]{"TABLE", "VIEW"});
   将其改成如下代码:
ResultSet rs = dbMeta.getTables(conn.getCatalog(), dbMeta.getUserName(), null, new String[]{"TABLE", "VIEW"});

   看能否解决问题,这几天正在想办法改进不同数据库的这个地方,可通过继承 MetaBuilder覆盖掉这个builderTableNames(...) 方法,然后通过 generator.setMetaBuilder(...) 来切换到你的实现上去。

   我这急需反馈,试用后早点反馈给我结果,感谢

0
代码搬运工程师
代码搬运工程师

引用来自“JFinal”的评论

   在 MetaBuilder 中找到这行代码:

ResultSet rs = dbMeta.getTables(conn.getCatalog(), null, null, new String[]{"TABLE", "VIEW"});
   将其改成如下代码:
ResultSet rs = dbMeta.getTables(conn.getCatalog(), dbMeta.getUserName(), null, new String[]{"TABLE", "VIEW"});

   看能否解决问题,这几天正在想办法改进不同数据库的这个地方,可通过继承 MetaBuilder覆盖掉这个builderTableNames(...) 方法,然后通过 generator.setMetaBuilder(...) 来切换到你的实现上去。

   我这急需反馈,试用后早点反馈给我结果,感谢

感谢大神迅速回复,我试了一下,按照你说的改法是不会报错了,但还是有问题的。

Build TableMeta ...
TableMeta 数量为 0,不生成任何文件


Process finished with exit code 0

我尝试简单粗暴的把他改成

ResultSet rs = dbMeta.getTables(conn.getCatalog(), "public", null, new String[]{"TABLE", "VIEW"});

可以生成public schema下的实体类。

感觉schema是不是应该可以做为一个参数传进来。

JFinal
JFinal
这个地方比较纠结,因为不同的数据库这个参数的意义不同,例如 oracle 中这个参数代表 userName,postgresql 这个地方代表 schema,得再权衡,或许这个地方提供扩展,让用户自己来决定传什么
0
玛雅牛
玛雅牛

jdbc:postgresql://localhost:15432/djpt?currentSchema=public,sys,app
最后的参数就是搜索schema的顺序。使用这个参数试一试。

0
车开源
车开源
看着就激动
0
代码搬运工程师
代码搬运工程师

引用来自“玛雅牛”的评论

jdbc:postgresql://localhost:15432/djpt?currentSchema=public,sys,app
最后的参数就是搜索schema的顺序。使用这个参数试一试。

加了currentSchema=public,但好像没起作用啊,我用的是tomcat连接池,不知道和这个有没有关系。

生成的时候还是会去查全部的schema

返回顶部
顶部