mysql项目改oracle

使用jfinal2.2。项目开始是以mysql搭建的,model使用generator生成,表名和字段名是大小写混用,正常运行。

改oracle:数据库用Navicat Premium数据迁移,从mysql迁移到oracle,

Q1:运行generator报错,dialect和ValidationQuery都设置成oracle的,提示ORA-00942: 表或视图不存在

blob.png

Q2:如果在mysql中手动修改_MappingKit,将表名都添加\"引号,可以启动,运行又会报错:

blob.png

提示是找不到属性名(没有手动修改model),在plsql中查看,Navicat Premium数据迁移过来的表和字段,都是和mysql中一样的(保持了大小写)。

请问波总:是否是oracle大小写问题(手动在oracle中创建表,表名和字段名全部大写,运行generator依然报Q1),mysql迁移到oracle可否有什么需要注意的地方,最佳实践,比如表怎么迁移,model是否需要修改或者重新生成。

评论区

JFinal

2016-11-11 11:04

简要说明一下:
1:方言要设置好,生成 model 以及运行时都要设置
2:oracle 默认会在 sql 查询出数据时,将字段名变为大写,但生成的 BaseModel 会是正确的,在读写字段时用 getter setter 方法即可
3:在没有使用 getter、setter 而是用 get(String) 的地方,注意大小写与字段名相同,但也可以使用一下 arp.setContainerFactory(new CaseInsensitiveFactory()) ,使其可以不用区分大小写
4:表不存在的问题,通常是当前用户有没有权限,虽然明明看到表是存在的,但是就是读不到

charlox

2016-11-11 11:50

@JFinal 感谢波总白忙中抽空解答

JFinal

2016-11-11 12:02

@charlox 感谢支持 jfinal 社区发展

zempty

2016-11-11 12:15

@charlox 播种对jfinal的提问非常踊跃回答的。

charlox

2016-11-11 14:23

@zempty 现在正在使用jfinal,非常不错,相互学习

JFinal

2016-11-11 14:35

@zempty @charlox 多多关注社区动态,多多支持 jfinal 发展,下个月发布 jfinal 2.3,确保四连冠

charlox

2016-11-11 16:17

@JFinal 感谢波总,时刻在关注,期待jfinal越来越强大。最近的项目一直在用jfinal,学习的东西还有很多,再问一下,关于oracle主键生成的怎么解决?烦请波总解答

charlox

2016-11-11 16:18

@JFinal 非常希望文档能够再详细些,感谢波总

charlox

2016-11-11 16:24

@JFinal 再请教一下,使用oracle时,ActiveRecordPlugin是需要显式设置事务级别,arp.setTransactionLevel(AppConstants.TRANSACTION_READ_COMMITTED);不然一直报错:com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLException: 仅 READ_COMMITTED 和 SERIALIZABLE 是有效的事务处理级

JFinal

2016-11-11 16:42

@charlox jfinal 手册上专门讲了 oracle 自动生成主键的方法,配有源代码,可直接使用, oracle 事务级别确实需要显式设置,这是因为 jfinal 2.2 将默认级别提升了,而 oracle 又正好不支持这个级别, jfinal 2.3 会改进这里

charlox

2016-11-11 17:32

@JFinal 感谢波总,id已经解决了。从oracle切换到mysql,提示Table 'safesms.SAFESMS_ACCOUNTINFO' doesn't exist,oracle能正常运行,arp.addMapping("SAFESMS_ACCOUNTINFO", "ID", Accountinfo.class);

JFinal

2016-11-11 17:34

@charlox arp.addMapping(...) 这些不要自己手写,用生成器会生成一个 "_MappingKit.java" 文件,是全自动搞定的

charlox

2016-11-11 17:38

@JFinal 是基于oracle自动生成的,表名和字段都是大写,切换成mysql就提示上面的错误,感觉是在表名前面又加了一个【表名前缀.】,现在系统是要做兼容mysql和oracle,请教波总

charlox

2016-11-11 17:41

@JFinal 是【数据库名.】,但是提示找不到表Table 'safesms.SAFESMS_ACCOUNTINFO' doesn't exist

zempty

2016-11-11 19:20

正等着下月的2.3!

charlox

2016-11-14 10:15

@JFinal 非常期待,感谢波总。再请教一个问题,现在做的系统是要兼容mysql和oracle的,关于主键的类型,遇到一点问题,oracle用序列,number类型,映射出来是java.math.BigDecimal,但是mysql如果用int类型自增长,映射出来是java.lang.Ingeger,提示不能转换类型,请教波总如何解决?

JFinal

2016-11-14 16:05

@charlox 可以引入一个 MyModel 继承自 Model,覆盖掉其中的 getter 方法,转换一下,可以这样来:
getNumber(attr).intValue()
这样就可以将 BigDecimal 转成 Integer 了,实现了两种数据库的统一

然后通过继承 BaseModelGenerator,将 BaseModel从原来的继承 Model 转而继承 MyModel 就打完收工了

jfinal 2.3 会将 ModelBuilder、RecordBuilder 接取成抽象类并让 Dialect 持有它,那个时候就可以通过定制这两个实现类来实现更为方便的控制了

charlox

2016-11-15 09:47

@JFinal 感谢波总悉心解答。期待jfinal 2.3...

寻路科技

2016-11-15 16:09

@charlox 您好!同样有需求,要换成oracle。也出现了Q1,然后services中的sql表名字段名,必须要加“”。求解决方法,谢谢!

charlox

2016-11-16 15:32

@寻路科技 在oracle中重新建表(表名,字段名都是大写),字段用_下划线分割,这样BaseModelGenerator生成的时候会转驼峰,统一页面属性取值,以oracle重新生成model,config中设置
//设置事务类别
arp.setTransactionLevel(2);
//设置忽略大小写
arp.setContainerFactory(new CaseInsensitiveContainerFactory());
如果要兼容mysql,需要注意建表表名大写,字段名与oracle保持一致。希望对你有帮助

寻路科技

2016-11-18 08:33

@charlox 好的好的。谢啦~

热门反馈

扫码入社